正则求助[已解决]
本帖最后由 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) 取字符超过8位 且不包函'----'字符 :将给定字符串存在new.txt中
#include<array.au3>
$Str=Fileread("new.txt")
$STR1=StringRegExp ($Str,"(?m)\w{8,}",3)
If IsArray ( $STR1) Then
_arraydisplay($STR1)
Endif 取既有数字又有字母还真不会简单的办法。
等高手吧 简单的不会,搞了个复杂点的,将给定字符串存在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:18 编辑
回复 2# whitehead
(?m)\w{8,}
这个我自己也想到过,他会过滤掉 123--2755,所以不能用
至于第二种,枚举的因为我要处理的文本比较大(200M以上),而且很多,每秒1000条左右的速度达不到我的要求。
不过还是谢谢你!! 本帖最后由 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.因为没看到你完整源码,不知道源字符串除了数字和字母以及”-”外还有哪些,就你提供的我又加了一些测试可行,速度可观,可根据情况小改。 刚看你的回复才发现,难道123--2755也是你想要的?你的意思四个-是非法的,两个-是合法的?如果真是这样,就还需在上面那个表达式基础上修改。 本帖最后由 wua0550 于 2012-12-23 03:29 编辑
自己搞定了~~
先用 StringReplace()把----给册掉 然后用正则去取就行了
$txt=StringReplace($txt,"----")
$txt=StringRegExp($txt,'((?!+\s)(?!]+\s).{8,}?)\s',3) 回复 8# wua0550
晕,原来你只是想把“----”去掉。。。。。我理解成一行中只要含“-”,整行便不匹配,不过好歹给你了个思路。另外你这正则也明显不对吧。 本帖最后由 wua0550 于 2012-12-23 15:00 编辑
回复 9# qq362817567
正则发上来的时候打错了 多了一个]
正确的应该是((?!+\s)(?!+\s).{8,})\s~~~确实是应该感谢你~~~
自己解释下正则吧
(?!+\s) 换行前不能是纯数字
(?!+\s)换行前不能是纯字母
.{8,} 取任意的8位以上字符
最外面的() 说明三种条件是一个组 {:face (382):}看看了,。。。
页:
[1]