perl正则表达式 捕获

请问结果为什么是下面着这样的?谢谢!... 请问结果为什么是下面着这样的?
谢谢!
展开
 我来答
jianxia2k
推荐于2017-09-30 · TA获得超过399个赞
知道小有建树答主
回答量:365
采纳率:82%
帮助的人:198万
展开全部

说实话,这个我也研究半天,虽然最终搞明白了,但这种肯定真正编程时是肯定不提倡使用的,正则非常巧妙,几个符号缺一不可。


首先搞懂顺序问题:

从perlre文档里面关于capture buffers的描述可以看出:Capture buffers are numbered from left to right,编号是从左到右的。也就是说,对于你这个表达式,最外面是$1, 中间是$2, 最里面是$3。


但下面还有一句:

but inside this construct the numbering is restarted for each branch.

编号会重新开始,也就是以前的编号里的内容就被替换掉了。

# before  ---------------branch-reset----------- after
/ ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x
# 1            2         2  3        2     3     4

然后程序解析正则,先看到的s...ly,于是找到了[softly],此为$3,然后要求0或多个空格,正好后面有一个空格,所以解析到了[softly ],此为$2。这时候关键来了,后面跟一个单纯的*。都知道*表示0或多次,但一般前面有个引导字符,表示你要0或多个什么字母,但这里前面没有字母,有的是一串的表达式,所以程序发现,我需要0或多个这种结构(s...ly)\s*的串,所以只能接着找看后来有没有这样的串。


所以程序接着找到[slowly],$3的内容被替换为这个,随后同样的$2被替换为[slowly ],然后再找,直到第4次,$3被替换为[subtly],$2同样是[subtly],查找结束,程序说,你要求0到多个(s...ly)\s*结构的串,我一共给你找到了4个这样的串,分别是:[softly ][slowly ][surely ][subtly],那么$1就是几个这样串的组合,就是完整的[softly slowly surely subtly]


说实话,我花了10分钟搞明白这个,自己都感觉挺无聊的,有时候不如折腾点有用的东西。。。。

yangqb21th
2014-12-28 · TA获得超过232个赞
知道小有建树答主
回答量:181
采纳率:100%
帮助的人:16.8万
展开全部
具体解释如下:
() -- 捕获
. -- 匹配任意字符
\s -- 匹配空格
* -- 大于等于0次匹配
---------
“softly slowly surely subtly” -- 这4个字符串都有一个共同的特点,就是字符s和ly之间都有3个字符,所以可以有三个"."来进行匹配, 这样可以得知打印的结果应该为前三个字符串
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式