perl正则表达式 捕获

提问者:逸秋#AAS 提问时间:2017年09月30日 人气:0
用户提问
请问结果为什么是下面着这样的?
谢谢!
推荐答案

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


首先搞懂顺序问题:

从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分钟搞明白这个,自己都感觉挺无聊的,有时候不如折腾点有用的东西。。。。

辅助答案
用户:陌生人
2017年11月16日
具体解释如下:
() -- 捕获
. -- 匹配任意字符
\s -- 匹配空格
* -- 大于等于0次匹配
---------
“softly slowly surely subtly” -- 这4个字符串都有一个共同的特点,就是字符s和ly之间都有3个字符,所以可以有三个"."来进行匹配, 这样可以得知打印的结果应该为前三个字符串