如何解释相同的结构表达式?(?= \ w {6,10})\ d +和(?= abc)ad`?
[email protected]:~$ echo "348dfgeccvdf" | grep -oP "\d+(?=\w{6,10})"
348
[email protected]:~$ echo "348dfgeccvdf" | grep -oP "(?=\w{6,10})\d+"
348
对于\d+(?=\w{6,10})
,这是标准的积极向前看的表达式。
作为Wiktor的Stribiżew说,在后
position and negative lookbehind
负回顾后语法与(?<! and ends with the unescaped)
开始。无论它出现在模式的开始,中间还是结尾,它都不会停止成为负面的后视。
也许在位置和整个前瞻(lookbehead)表达之间没有实用性。如何解释相同的结构表达式?(?= w {6,10}) d +和(?= abc)ad`?
提前按照同样的逻辑,如Wiktor的Stribiżew说负回顾后推断正面看:
"\d+(?=\w{6,10})" == "(?=\w{6,10})\d+"
他们两人都是积极的向前看。
现在,这里是另一个例子:
echo "adabc adabb" |grep -oP "ad(?=abc)"
ad
echo "adabc adabb" |grep -oP "(?=abc)ad"
为什么"ad(?=abc)"
不等于"(?=abc)ad"
?
如何解释相同的结构表达式(?=\w{6,10})\d+ and (?=abc)ad
?
为什么“ad(?= abc)”不等于“(?= abc)ad”?
ad(?=abc)
解释了随后abc
而(?=abc)ad
不会与任何输入字符串匹配ad
。原因期待'abc'后面跟着(?=abc)
,但在积极向前看后定义为ad
! 。图案应该是这样的(?=abc)\w+
到与该输入字符串abcad
如何解释相同的结构表达式(?= \ W {6,10})\ d +和(β= ABC)广告匹配吗?
(?=\w{6,10})\d+
对于任何输入字符串,此模式也不会与此(?=abc)ad
相匹配。模式应该是这样的:
(?=\w{6,10})\w+
和(?=abc)\w+
。
Wiktor的Stribiżew说负回顾后:
"\d+(?=\w{6,10})" == "(?=\w{6,10})\d+"
这不是他说什么。他的例子特别是与字边界,这也是一个零长度断言。只有
…(?lookaround)\b… == …\b(?lookaround)…
可以容纳。
为什么
"ad(?=abc)"
不等于"(?=abc)ad"
?
由于一个断言匹配ad
后的序列abc
,而另一个尝试在开始断言它(这将总是失败)。
Lookarounds是[zero-length assertions](http://www.regular-expressions.info/lookaround.html),它们在字符/开始/结束之间的某个位置被“解雇”。在这个位置,他们“看”前进或后退的定义条件。 –
在Wiktors示例中,他正在改变字边界('\ b')的位置和负面的后视 - 由于这两个都是零宽度断言,所以这是可能的。在你的样本中,你交换了一个前瞻和一个匹配模式 - 这导致了一个根本不同的整体模式。 –
而你似乎误解了他的_它是否出现在pattern_的开始,中间或结尾。这并不是说,匹配的过程与查找表的位置无关 - 只是查找模式仍然是一个查看。 –