如何解释相同的结构表达式?(?= \ 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

+1

Lookarounds是[zero-length assertions](http://www.regular-expressions.info/lookaround.html),它们在字符/开始/结束之间的某个位置被“解雇”。在这个位置,他们“看”前进或后退的定义条件。 –

+0

在Wiktors示例中,他正在改变字边界('\ b')的位置和负面的后视 - 由于这两个都是零宽度断言,所以这是可能的。在你的样本中,你交换了一个前瞻和一个匹配模式 - 这导致了一个根本不同的整体模式。 –

+1

而你似乎误解了他的_它是否出现在pattern_的开始,中间或结尾。这并不是说,匹配的过程与查找表的位置无关 - 只是查找模式仍然是一个查看。 –

为什么“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,而另一个尝试在开始断言它(这将总是失败)。