afan
发表于 2010-10-18 13:20:45
本菜鸟招数已尽,无力出招… {:face (113):}#include <Array.au3>
$Str = 'lucy nalyst lucy groi analyspt pucy ppoi afsf pucy ioui anqlyor'
$sR = StringRegExp($Str, '((\b\w+)\s+\w+(?=\s+\2|\s+a\w+(?=pt\b|or\b)))', 3)
_ArrayDisplay($sR, UBound($sR))
binghc
发表于 2010-10-18 13:58:13
本帖最后由 binghc 于 2010-10-18 14:01 编辑
回复 16# afan
呵呵,版主谦虚了
我分析一下你的表达式:((\b\w+)\s+\w+(?=\s+\2|\s+a\w+(?=pt\b|or\b)))
你这里的子分支中应用到了环视,这样在最后返回的数组中符合条件的子字符串还是规律性的出现:在每一条数组后都只插入了一条不合符要求的子字符串,然后又是一条符合要求的字符串。符合要求的字符串规律性出现
那如果说(?=pt\b|or\b)后面又得用到这里捕获的文本,那这里要写成(pt\b|or\b),这样你再看看最后返回的数组,目标子字符串是否还是在返回数组中规律性出现。
很显然不是。
在更复杂的情况下要在返回的数组中分析出符合条件的子字符串并不容易
这样一来,我就要在所返回的数组中再找出真正符合要求的子字符串。也就是说这个返回的数组中不是纯符合要求的子字符串。
是的,有时候不是“纯”的没多大影响,因为简单情况下我们只要其中的一条,很容易知道符合要求的字符串会出现在数组中的第几个。
而现在,是要批量找出所有符合要求的子字符串,很多时候会难以确定它们会出现在所返回数组中的第几个
我想说的是:一般在其他语言里并不需要对整个表达式加括号。而在au3里,正则中如果用到捕获就得对整个表达式加括号,而且在最后返回的数组中会对出几项我们不期望他出现的字符串。这无疑对我们寻找符合条件的子字符串增加了难度。
afan
发表于 2010-10-18 16:27:46
回复afan
呵呵,版主谦虚了
我分析一下你的表达式:((\b\w+)\s+\w+(?=\s+\2|\s+a\w+(?=pt\b|or\b))) ...
binghc 发表于 2010-10-18 13:58 http://www.autoitx.com/images/common/back.gif
惭愧,真没系统学习过正则,每次都“达到目的即可,没深究”…
最近想做个学习工具,想完成之后再系统的学习下~
shun.and.fa
发表于 2010-10-18 17:09:00
谢谢。{:face (409):}
binghc
发表于 2010-10-18 18:47:05
本帖最后由 binghc 于 2010-10-18 20:36 编辑
我最后再出一道题,有兴趣的朋友可以研究一下,之后我也会给出我写的两种不同原理实现方式的表达式,看招:
1许多2个时候,美是一种距离2站在时8年空之外5月想象你8次会更加美好10000爱情亦如斯3一种憧憬的欣羡的美丽7号一种咀嚼与回味的情韵8号码一种回归与复得的幸福。
说明:这其实是几个电话号码拨打的记录,现在就是用正则分解出每个电话的记录:
要求:
1每条记录之前会有一个数字
2一条记录中可能包含数字,但是这个数字是有条件的:该数字后面的会紧跟一个汉字:"年、月、趟、个、次"中的一个或者该数字至少是两个个数字连在一起的
3一条记录中可能出现数字:如果这个数字后面是汉字"号",那么这个号后面不能是汉字"码"
最后返回:
1许多2个时候,美是一种距离
2站在时8年空之外5月想象你8次会更加美好10000爱情亦如斯
3一种憧憬的欣羡的美丽7号一种咀嚼与回味的情韵
8号码一种回归与复得的幸福。
afan
发表于 2010-10-18 19:24:59
这个难了,搞不定~ {:face (270):}
binghc
发表于 2010-10-18 19:31:18
本帖最后由 binghc 于 2010-10-18 19:33 编辑
回复 21# afan
{:face (258):} 啊~不是吧!再想想。。。
afan
发表于 2010-10-18 19:40:54
本帖最后由 afan 于 2010-10-18 19:42 编辑
只能搞成这样#include <Array.au3>
$Str = '1许多2个时候,美是一种距离2站在时8年空之外5月想象你8次会更加美好10000爱情亦如斯3一种憧憬的欣羡的美丽7号一种咀嚼与回味的情韵8号码一种回归与复得的幸福。'
$sR = StringRegExp($str, '\d(?!\d|号[^码]).*?(?:(?:\d[年月趟个次]|\d{2,}).*?)*(?=\d|$)', 3)
_ArrayDisplay($sR, UBound($sR))1许多2个时候,美是一种距离
2站在时8年空之外5月想象你8次会更加美好10000爱情亦如斯
3一种憧憬的欣羡的美丽
8号码一种回归与复得的幸福。
[完毕]
binghc
发表于 2010-10-18 19:56:58
本帖最后由 binghc 于 2010-10-18 20:02 编辑
回复 23# afan
呵呵,好像少了点什么哈!{:face (197):}
这确实是个难点,再想想有没有什么办法能解决这个问题,这是个有趣的题目
afan
发表于 2010-10-18 19:59:58
本帖最后由 afan 于 2010-10-18 20:01 编辑
不够简练的说,8年还是没办法去掉#include <Array.au3>
$Str = '1许多2个时候,美是一种距离2站在时8年空之外5月想象你8次会更加美好10000爱情亦如斯3一种憧憬的欣羡的美丽7号一种咀嚼与回味的情韵8号码一种回归与复得的幸福。'
$sR = StringRegExp($str, '\d(?!\d|号[^码]).*?(?:(?:\d[年月趟个次]|\d{2,}|\d号[^码]).*?)*(?=\d|$)', 3)
_ArrayDisplay($sR, UBound($sR))1许多2个时候,美是一种距离
2站在时8年空之外5月想象你8次会更加美好10000爱情亦如斯
3一种憧憬的欣羡的美丽7号一种咀嚼与回味的情韵
8号码一种回归与复得的幸福。
[完毕]
你还真是够折腾银的滴…
binghc
发表于 2010-10-18 20:11:43
回复 25# afan
之前我为了逼你出招,使用正则中的某种功能,不得不增加题目难度。
但是现在这道题很现实:
为什么说一条记录中可以出现这样一个数字,这个数字后面可以是汉字"号",而不能是"号码"
{数字后面可以是汉字"号"}这没问题:因为电话记录中可以出现日期。比如:上个月3号
再来看两外一个条件
如果这个号码本身就不对的,比如它少了一位数,那我就要先写个数字,后面跟上号码不对。
binghc
发表于 2010-10-18 20:22:01
本帖最后由 binghc 于 2010-10-18 21:41 编辑
方法一:
(?<=\D|^)\d(?(?=号)(?=号码)|(?=[^月年个次趟\d])).*?(?=(?<=\D|^)\d(?(?=号)(?=号码)|(?=[^月年个次趟\d]))|$)
这是我的写的表达式,仅供参考
这里用到了条件判断语句,相当于If...Then...Else...
afan
发表于 2010-10-18 20:29:17
这个好像“8年”也在?
1许多2个时候,美是一种距离
2站在时8年空之外5月想象你8次会更加美好10000爱情亦如斯
3一种憧憬的欣羡的美丽7号一种咀嚼与回味的情韵
8号码一种回归与复得的幸福。
[完毕]
binghc
发表于 2010-10-18 20:34:25
回复 28# afan
哦~是我改了源字符串,答案还没改过来
你看一下要匹配的字符串条件:该数字后面的会紧跟一个汉字:"年、月、趟、个、次"中的一个
afan
发表于 2010-10-18 20:41:56
本帖最后由 afan 于 2010-10-18 20:44 编辑
回复afan
哦~是我改了源字符串,答案还没改过来
你看一下要匹配的字符串条件:
binghc 发表于 2010-10-18 20:34 http://www.autoitx.com/images/common/back.gif
害我弄死了N多无辜的脑细胞&掐死了几根烟。
话说回来,如果在匹配时需要排除掉“8年”,有没有办法输出“站在时空之外”? 当然不是在结果中“&”连接,而是让输出的结果直接不包含“8年”