wua0550 发表于 2012-12-22 15:08:42

正则求助[已解决]

本帖最后由 wua0550 于 2012-12-23 03:29 编辑

文本内容

xzw307
qq315908576
123982755
xzw307
xzwxdsdfsdf
123--2755
12334982----
12398275


我想取出 每行中字符超过8位不是纯数字或纯字母且不包函'----'字符怎么写~~
一次正则如果不行的话只取字符超过8位 且不包函'----'字符 就行

实在是想不出来~麻烦各位了
$txt=StringReplace($txt,"----")
$txt=StringRegExp($txt,'((?!+\s)(?!]+\s).{8,}?)\s',3)

whitehead 发表于 2012-12-22 19:00:32

取字符超过8位 且不包函'----'字符 :将给定字符串存在new.txt中

#include<array.au3>
$Str=Fileread("new.txt")
$STR1=StringRegExp ($Str,"(?m)\w{8,}",3)
If IsArray ( $STR1) Then
_arraydisplay($STR1)
Endif

whitehead 发表于 2012-12-22 19:02:19

取既有数字又有字母还真不会简单的办法。
等高手吧

whitehead 发表于 2012-12-22 20:54:28

简单的不会,搞了个复杂点的,将给定字符串存在new.txt中,结果见new1.txt中:
#include<file.au3>
Dim $array
$file1 = FileOpen("new1.txt", 1)
_FileReadToArray("new.txt",$array)
For $i=1 to UBOUND($array)-1
$line=String($array[$i])
If StringLen ($line)>8 AND StringRegExp ($line,".*+.*\d+.*",0)=1 OR StringRegExp ($line,".*\d+.*+.*",0)=1 Then
FileWriteLine ($file1, $line)
Endif
next
Fileclose($file1)

wua0550 发表于 2012-12-22 21:13:17

本帖最后由 wua0550 于 2012-12-22 21:18 编辑

回复 2# whitehead

(?m)\w{8,}
这个我自己也想到过,他会过滤掉 123--2755,所以不能用

至于第二种,枚举的因为我要处理的文本比较大(200M以上),而且很多,每秒1000条左右的速度达不到我的要求。

不过还是谢谢你!!

qq362817567 发表于 2012-12-22 22:49:50

本帖最后由 qq362817567 于 2012-12-23 01:58 编辑

#include <array.au3>
Local $Str = _
                'xzw307' & @CRLF & _
                'qq315908576' & @CRLF & _
                '123982755' & @CRLF & _
                'xzw307' & @CRLF & _
                'xzwxdsdfsdf' & @CRLF & _
                '123--2755' & @CRLF & _
                '12334982----' & @CRLF & _
                '12398275' & @CRLF & _
                '12345666ty3'& @CRLF & _
                '1111111111111111'& @CRLF & _
                'wwwwwwwwwwwwwwwwwww'& @CRLF & _
                '222222222222222'
$txt=StringRegExpReplace($str,'(?i)(?<=^|\n)\V{0,7}(?=\v|$)',"")
$txt=StringRegExp($txt,'(?i)(?<=^|\n)(?:\d+|+\d)\w*(?=\v|$)',3)
_ArrayDisplay($txt)

先把低于8位的行删除,就方便一些了,不知道你的要求包不包含8位的,如果不包含,需要把第一个表达式中的7换成8.因为没看到你完整源码,不知道源字符串除了数字和字母以及”-”外还有哪些,就你提供的我又加了一些测试可行,速度可观,可根据情况小改。

qq362817567 发表于 2012-12-23 01:49:59

刚看你的回复才发现,难道123--2755也是你想要的?你的意思四个-是非法的,两个-是合法的?如果真是这样,就还需在上面那个表达式基础上修改。

wua0550 发表于 2012-12-23 03:26:13

本帖最后由 wua0550 于 2012-12-23 03:29 编辑

自己搞定了~~

先用 StringReplace()把----给册掉 然后用正则去取就行了
$txt=StringReplace($txt,"----")
$txt=StringRegExp($txt,'((?!+\s)(?!]+\s).{8,}?)\s',3)

qq362817567 发表于 2012-12-23 09:14:08

回复 8# wua0550


    晕,原来你只是想把“----”去掉。。。。。我理解成一行中只要含“-”,整行便不匹配,不过好歹给你了个思路。另外你这正则也明显不对吧。

wua0550 发表于 2012-12-23 14:55:07

本帖最后由 wua0550 于 2012-12-23 15:00 编辑

回复 9# qq362817567


正则发上来的时候打错了 多了一个]
正确的应该是((?!+\s)(?!+\s).{8,})\s~~~确实是应该感谢你~~~
自己解释下正则吧
(?!+\s)   换行前不能是纯数字
(?!+\s)换行前不能是纯字母
.{8,} 取任意的8位以上字符
最外面的() 说明三种条件是一个组

javarike 发表于 2012-12-29 00:46:48

{:face (382):}看看了,。。。
页: [1]
查看完整版本: 正则求助[已解决]