- 论坛徽章:
- 95
|
本帖最后由 MMMIX 于 2015-09-27 12:05 编辑
回复 19# sunzhiguolu
实在看不明白你都在说啥,我还是直接描述下这个正则的匹配过程吧。
把正则表达式 \b(([0-9])\2)+4 拆成三部分,分别为 re1 = \b, re2 = (([0-9])\2), re3 = 4, 整个正则记为 re. 那么 re 匹配字符串 "11223344" 的过程如下:
1. 先匹配 re1 = \b
由于 \b 是 word 边界,可以匹配到字符串开始;所以匹配成功,匹配结束的位置为字符串开头。
2. 然后匹配 re2 = (([0-9]\2)+,匹配开始的位置为 re1 匹配结束的位置,也即字符串的开头
2.1 (([0-9])\2) 匹配 "11.." 成功,此时 $1 = "11", $2 = 1;
2.2 由于有 +,所以继续匹配 (([0-9])\2),直到无法继续为止;
2.3 $1 和 $2 的值依次为 “22”, “2”(第二次),“33”,“3”(第三次),“44”,“4”(第四次);
2.4 此时已到字符串结尾,无法继续,re2 匹配成功,匹配结束位置为字符串结尾
3. 然后匹配 re3 = 4,匹配开始位置为 re2 匹配结束的位置,也即字符串的结尾
3.1 re3 匹配失败;
3.2 匹配位置回退一个字符,检查在此位置匹配 re2是否能成功;若失败,继续回退;
3.3 匹配位置回退两个字符之后,re2 可以匹配成功;此时匹配位置在 3 和 4 之间,$1 = "33", $2 = "3";
4. 重新匹配 re3 = 4,匹配开始位置在 3 和 4 之间,匹配成功;
5. 整个正则 re 匹配成功。
注意,虽然整体上 (([0-9])\2)+ 会匹配到 "112233",但是由于 + 相当于一个循环,在每次循环中,(([0-9])\2) 匹配到的内容都是不一样的,从而每次循环中 $1 和 $2 的值也都不一样,而最终的 $1 和 $2 的值是其循环过程中最后一次的值。 |
评分
-
查看全部评分
|