我正在努力理解积极和消极的前瞻,但我想我错过了一些东西。
q(?=u)
我理解这个正则表达式的意思是:“匹配一个后跟一个u的q”,所以我得到一个匹配字符串“quit”,但只获得一个带有'q'的组。
但是使用正则表达式q(?= u)i,我没有得到任何字符串“quit”的结果。为什么会这样?可能这个正则表达式没有意义,但我想知道它是什么意思,以了解前瞻。
答案 0 :(得分:2)
前瞻不会消耗其文本。 qu
与q(?=u)
不同 - 后者只匹配q
,但要求u
后面跟着q(?=u)i
(但不会被捕获或消费)。
这就是q
无法匹配的原因 - u
需要同时跟i
和 qi
,是不可能的。换句话说,它会查找并捕获q
,但前提是u
后面紧跟i
,如果后跟qui
,则显然不是真的。
如果您想匹配qui
,那么正则表达式为Thread.Sleep
。
答案 1 :(得分:1)
如果你想要匹配其他东西不匹配的东西,那么否定的先行是必不可少的。在解释字符类时,本教程解释了为什么不能使用否定字符类来匹配q后面跟着你。负向前瞻提供了解决方案:q(?!u)。负前瞻构造是一对括号,左括号后跟一个问号和一个感叹号。在前瞻中,我们有琐碎的正则表达式。
积极前瞻的作用是一样的。 q(?= u)匹配一个后跟u的q,而不是匹配的u部分。积极的先行构造是一对括号,左括号后跟一个问号和一个等号。