正则表达式
/(?=\w{6})(?=\w*\d{2})/
前面的括号代表的什么
后面的括号代表的什么
这个表达式意义并不大,因为没有确定指定的字符,?=表示预匹配,匹配之后下一次匹配从匹配到的字符开始,预匹配的字符不计入匹配运算。
从以上讨论一般来说?=一般用在结尾匹配,因为在?=再去匹配其他确切字符没有什么意义
正题:先举例一个有意义的a(?=\w{6});
\w代表匹配[a-zA-Z0-9_]中的一个字符,{6}表示出现六次,再加上?=,合起来就是预匹配a,要求a后面有6次[a-zA-Z0-9_]
举例:字符串a12_awAq,匹配到的是第一个a,但是匹配不到第5个a,因为第一个a后面有预匹配的要求,12_awA。而第5个后面有wAq,不足6个,因此匹配不到。
如果上述后面还需要匹配,则从1开始匹配。这也就是下面说的a(?=\w{6})(?=\w\d{2});
单独拆分a(?=\w\d{2}),它的意思是匹配a后面出现 0~n 次[a-zA-Z0-9_],但是最后必须有2个[0-9];
a(?=\w{6})(?=\w*\d{2}),合起来的意思是匹配a(后面有6次[a-zA-Z0-9_])并且(0~n次[a-zA-Z0-9_]中,有两位必须是[0-9])
比如:a12_aA22a3e44,匹配结果是【a,a】,这两个a分别代表是前两个a,但是匹配不到第三个a,
原因:
因此/(?=\w{6})(?=\w*\d{2})/就是匹配这样格式的空字符
第一个括号表示当前字符后面有6个字符是字母、数字或下划线
第二个括号表示当前字符后面有任意个字母、数字或下划线然后然后是两个数字
Look ahead positive (?=
)
Find expression A where expression B follows:
A(?=B)
https://stackoverflow.com/questions/2973436/regex-lookahead-lookbehind-and-atomic-groups