[问题]正则表达式 "(\w)((?=\1\1\1)(\1))+"的解读

sh/bash/dash/ksh/zsh等Shell脚本
回复
JIAN
帖子: 63
注册时间: 2007-01-13 14:55
送出感谢: 0
接收感谢: 0

[问题]正则表达式 "(\w)((?=\1\1\1)(\1))+"的解读

#1

帖子 JIAN » 2007-12-18 23:20

表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。
为什么会解读成这样子的?
为什么会剩下最后两位没有匹配的?
xiechy
帖子: 1074
注册时间: 2006-01-18 15:01
送出感谢: 0
接收感谢: 1 次

#2

帖子 xiechy » 2007-12-19 12:57

(?=\1\1\1)表示该位置后面跟有3个\1
头像
patrickhe
帖子: 681
注册时间: 2005-07-21 19:13
来自: Peking, China
送出感谢: 0
接收感谢: 0
联系:

Re: [问题]正则表达式 "(\w)((?=\1\1\1)(\1))+"的解读

#3

帖子 patrickhe » 2008-01-15 10:34

JIAN 写了:表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。
为什么会解读成这样子的?
为什么会剩下最后两位没有匹配的?
1. \w 先匹配到一个英数字符。
2. (?=\1\1\1)\1 匹配第一个 group 中匹配到的字符3次——表面上看这个表达式匹配了4个字符,实际上只要3个相同的字符就能满足匹配要求。加上之前的 \w,就是要求匹配重复一个4次以上的英数字符串。
3. 最后面的 + 限定了第二个 group: ((?=\1\1\1)\1),也就是要求在匹配字符之后至少存在3个或者3个以上的重复字符才能匹配成功,所以当匹配到重复字符串末尾只剩两个字符的时候,该表达式即不能匹配成功,所以最后2个重复字符是永远会被排除在匹配到的字符串之外的。
JIAN
帖子: 63
注册时间: 2007-01-13 14:55
送出感谢: 0
接收感谢: 0

#4

帖子 JIAN » 2008-01-15 20:19

哦,明白了
谢谢!!!
回复

回到 “Shell脚本”