找回密码
 加入
搜索
查看: 5963|回复: 10

[效率算法] 正则求助[已解决]

  [复制链接]
发表于 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,'((?![0-9]+\s)(?![a-zA-Z]]+\s).{8,}?)\s',3)
发表于 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
发表于 2012-12-22 19:02:19 | 显示全部楼层
取既有数字又有字母还真不会简单的办法。
等高手吧
发表于 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,".*[a-z]+.*\d+.*",0)=1 OR StringRegExp ($line,".*\d+.*[a-z]+.*",0)=1 Then
FileWriteLine ($file1, $line)
Endif
next
Fileclose($file1)
 楼主| 发表于 2012-12-22 21:13:17 | 显示全部楼层
本帖最后由 wua0550 于 2012-12-22 21:18 编辑

回复 2# whitehead

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

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

不过还是谢谢你!!
发表于 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+[a-z]|[a-z]+\d)\w*(?=\v|$)',3)
_ArrayDisplay($txt)

先把低于8位的行删除,就方便一些了,不知道你的要求包不包含8位的,如果不包含,需要把第一个表达式中的7换成8.因为没看到你完整源码,不知道源字符串除了数字和字母以及”-”外还有哪些,就你提供的我又加了一些测试可行,速度可观,可根据情况小改。
发表于 2012-12-23 01:49:59 | 显示全部楼层
刚看你的回复才发现,难道123--2755也是你想要的?你的意思四个-是非法的,两个-是合法的?如果真是这样,就还需在上面那个表达式基础上修改。
 楼主| 发表于 2012-12-23 03:26:13 | 显示全部楼层
本帖最后由 wua0550 于 2012-12-23 03:29 编辑

自己搞定了~~

先用 StringReplace()把----给册掉 然后用正则去取就行了
$txt=StringReplace($txt,"----")
$txt=StringRegExp($txt,'((?![0-9]+\s)(?![a-zA-Z]]+\s).{8,}?)\s',3)
发表于 2012-12-23 09:14:08 | 显示全部楼层
回复 8# wua0550


    晕,原来你只是想把“----”去掉。。。。。我理解成一行中只要含“-”,整行便不匹配,不过好歹给你了个思路。另外你这正则也明显不对吧。
 楼主| 发表于 2012-12-23 14:55:07 | 显示全部楼层
本帖最后由 wua0550 于 2012-12-23 15:00 编辑

回复 9# qq362817567


正则发上来的时候打错了 多了一个]
正确的应该是
((?![0-9]+\s)(?![a-zA-Z]+\s).{8,})\s
~~~确实是应该感谢你~~~
自己解释下正则吧
(?![0-9]+\s)   换行前不能是纯数字
(?![a-zA-Z]+\s)  换行前不能是纯字母
.{8,} 取任意的8位以上字符
最外面的() 说明三种条件是一个组
发表于 2012-12-29 00:46:48 | 显示全部楼层
看看了,。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-13 21:56 , Processed in 0.081594 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表