找回密码
 加入
搜索
查看: 22649|回复: 47

[系统综合] [已解决]谈谈au3正则中的括号

 火.. [复制链接]
发表于 2010-10-16 22:21:46 | 显示全部楼层 |阅读模式
本帖最后由 binghc 于 2010-10-23 12:08 编辑

我现在只知道,au3命名捕获的话stringregexp要在模式2下才能用,模式3就出现了奇怪的问题
现在主要是想让他在模式3下能用文本捕获,因为很多功能要在模式3下才能完成,模式2好像也是支持命名捕获的
那么,StringregExp在模式等于3时,怎么用捕获文本?
高手求救

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-10-16 22:56:54 | 显示全部楼层
捕获什么文本,用例子说话岂不更好
 楼主| 发表于 2010-10-16 23:12:04 | 显示全部楼层
例子给出的答案往往只是针对这个例子
首先模式2,不支持环视
一般写正则表达式都会是模式3
很多功能在模式3中能用,唯一不能用的就是捕获字符串
要用只能切换到模式2,切换后其他更多的功能又不能用了
简单的说,就是一条表达式中会同时用到捕获字符串,和环视。(这只是简单的表达式,稍复杂一点可能会出现分支,判断什么的)
现在的问题视乎是,在au3中字符捕获功能和其他功能是分开的,走不到一起
 楼主| 发表于 2010-10-16 23:27:26 | 显示全部楼层
本帖最后由 binghc 于 2010-10-16 23:30 编辑

diu kitty fcb kitty hig kitty ig
现在要匹配一个单词:
1、在这个单词之后的第二个单词还是这个单词:字符串中的第一个kitty和第二个Kitty都满足此条件
2、最后要匹配出的这个单词(kitty)的第一个单词的首字母要以h打头:那么现在满足条件的就是第二个kitty了
最后:
匹配出这个单词后,为了便于看清匹配出的具体是哪个单词,也把紧跟它后面的单词一起输出:要求最后返回这个单词和紧跟它后面的第一个单词:kitty hig
 楼主| 发表于 2010-10-17 10:47:26 | 显示全部楼层
我就在想,这到底是不是au3正则本身的问题呢,有时候我在用多分支的时候有需要结合迭代。
比如(首先声明,au3一般写正则的时候都会用stringregexp模式等于3,因为其他模式很多时候跟本匹配不出我们要的子字符串):
(\w|\d)*     这样写的时候往往出现奇怪的结果,非得改成(?:\w|\d)* 这样才行。
虽然说很多时候我并不需要它捕获什么!
发表于 2010-10-17 12:42:03 | 显示全部楼层
本帖最后由 afan 于 2010-10-17 12:45 编辑
$Str = 'diu kitty fcb kitty hig kitty ig'
;标志2
$sR = StringRegExp($Str, '(\w+)\s+h\w+(?=\h+\1)', 2)
MsgBox(0, $Str, $sR[0])
;标志3
$sR = StringRegExp($Str, '((\w+)\s+h\w+(?=\h+\2))', 3)
MsgBox(0, $Str, $sR[0])

评分

参与人数 1金钱 +30 收起 理由
3mile + 30 又学一招,多谢

查看全部评分

发表于 2010-10-17 13:38:17 | 显示全部楼层
正则这个概念我很不懂,我经常看到正则这个词,看来我得加快学习的脚步了。
 楼主| 发表于 2010-10-17 19:04:30 | 显示全部楼层
本帖最后由 binghc 于 2010-10-17 19:23 编辑

回复 6# afan


   这么说来,模式3确实是可以用捕获的,只是如果要用捕获,就要对整个表达式再上个括号,没错吧。
发表于 2010-10-17 21:49:33 | 显示全部楼层
回复 8# binghc


    按你的需求,基本如此~ 不过要注意捕获的组号要随之递加
 楼主| 发表于 2010-10-18 00:32:32 | 显示全部楼层
本帖最后由 binghc 于 2010-10-18 00:47 编辑

好,那么我现在给这道题增加点难度:
diu kitty fcb kitty hegfe kitty hijoe kitty hpg kitty
现在要匹配出的字符串条件还是和上面一样,这时符合条件的结果有:kitty hegfe、kitty hijoe、 kitty hpg
现在我要再增加一个条件:h打头的单词的第三个字母要是j。也就是说最后返回结果是:kitty hijoe
要求用环视检查这个h打头的单词的第三个字母(是的,这题不用环视更容易解决:直接用h\wj。但是事实是,很多时候必须用环视来检查)



本题意在增加原有表达式的复杂程度:表达式中既出现捕获又出现环视
发表于 2010-10-18 01:30:40 | 显示全部楼层
6#不是已经符合“表达式中既出现捕获又出现环视”了吗?
我只知道用h\wj\w*即可,不知道为何要环视,如必须的话(?=h\wj\w*)不是和h\wj\w*一样吗?
不懂具体应用,不知你的答案是怎样的?
 楼主| 发表于 2010-10-18 09:39:22 | 显示全部楼层
本帖最后由 binghc 于 2010-10-18 09:45 编辑

回复 9# afan
额。。。是我没看清楚又出招了,我换道:
lucy nalyst lucy groi analyst pucy ppoi afsf pucy ioui anqlyr
目标子字符串条件:
匹配一个单词:这个单词后的第二个单词还是这个单词,或者,这个单词后的第二个单词要以a打头t结尾或者a打头r结尾
最后输出这个单词和后面紧跟的单词:
lucy nalyst、lucy groi、pucy ioui

说说本题为什么这么出:au3在模式3中如果要捕获字符串,要对整个字符串加括号,这样返回的数组中不是纯答案,中间会有一些不是最后结果的字符串。这样一来就要在返回的数组中找出符合的答案,这有点困难了
发表于 2010-10-18 10:32:44 | 显示全部楼层
回复 12# binghc
哈哈,这个好玩,学习一下。
只能做到这样了:
#include <array.au3>
$Str = 'lucy nalyst lucy groi analyst pucy ppoi afsf pucy ioui anqlyr'
;标志3
$sR = StringRegExp($Str, '((\w+)\s+\w+(?=\h+\2))|((\w+)\s+\w+(?=\ha\w+t\b))|((\w+)\s+\w+(?=\ha\w+r\b))', 3)
_ArrayDisplay($sR)
发表于 2010-10-18 11:22:45 | 显示全部楼层
#include <Array.au3>
$Str = 'lucy nalyst lucy groi analyst pucy ppoi afsf pucy ioui anqlyr'
$sR = StringRegExp($Str, '((\w+)\s+\w+(?=\s+(?=\2|a\w+?[t|r]\b)))', 3)
_ArrayDisplay($sR, UBound($sR))

评分

参与人数 1金钱 +30 收起 理由
3mile + 30 这个强。学习了

查看全部评分

 楼主| 发表于 2010-10-18 12:29:43 | 显示全部楼层
本帖最后由 binghc 于 2010-10-18 13:04 编辑

回复 14# afan

其实我就想逼你出招:
在表达式中用分支结构中又出现括号,其实我想让你这么写:((\b\w+)\s\w+\s(?=\2|a\w+(t\b|r\b)))
(上面的\s不应该写在这儿,现在为了让表达式清晰一点将就一下。用意还是在后面的分支)

顺便说一下,你的表达式中((\w+)\s+\w+(?=\s+(?=\2|a\w+?[t|r]\b)))中间的|可以去掉
现在我我对上题稍作修改:
lucy nalyst lucy groi analyspt pucy ppoi afsf pucy ioui anqlyor
目标子字符串条件:
匹配一个单词:这个单词后的第二个单词还是这个单词,或者,这个单词后的第二个单词要以a打头pt结尾或者a打头or结尾
现在要求你在原有表达式基础上稍作修改:表达式中的(?=\2|a\w+?[t|r]\b),分支数不能增加,也就是说要让你的字符组[t|r]改成子分支。简单的说:分支嵌套

最后返回:lucy nalyst、lucy groi、pucy ioui
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 13:51 , Processed in 0.096529 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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