2017-08-12 11 views
0
[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として
は、負の後読みの構文は(?<! and ends with the unescaped)で始まるポスト
position and negative lookbehind
で言います。パターンの開始、途中、または終わりのいずれに表示されても、それはネガティブなルックバックではありません。
位置と完全な先読み(lookbehind)の表現の間には関係がないかもしれません。このようWiktor第Stribiżewと同じロジックに従って、先にポジティブな外観のために推測すること同じ構造式 `(?= w {6,10}} d +と(?= abc)ad`を説明する方法は?

は否定後読みのために言う:

"\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

[ゼロ長のアサーション](http://www.regular-expressions.info/lookaround.html)は、文字/開始点/終了点の特定の位置で「起動」されます。この位置では、定義された状態のために前方または後方を「見る」。 –

+0

Wiktorsサンプルでは、​​単語境界( '\ b')と負のルックバックの位置を変更しています。これは両方ともゼロ幅アサーションであるため可能です。あなたのサンプルでは、​​先読みと一致するパターンを交換します。これは、基本的な異なる全体パターンにつながります。 –

+1

あなたは彼のことを誤解しているように見えます_それはパターンの始め、途中、または終わりに現れます_。これは、一致する進捗状況がルックアラウンドの位置とは独立して同じであることを示しているわけではありません。 –

答えて

0

なぜ "ad(?= abc)"は "(?= abc)ad"と等しくないのですか?

ad(?=abc)(?=abc)adは任意入力文字列と一致しないであろう一方abc続いadを説明します。 'abcに続いて'と予期します(?=abc)しかし、肯定的な先読みの後にadを定義してください! 。パターンは、この入力文字列(?= \ W {6,10})\ D +と(?= ABC)広告同じ構造式を説明するための方法abcad

と一致するように、この(?=abc)\w+ようにすべきですか?

(?=\w{6,10})\d+このパターンも入力文字列には(?=abc)adと一致しません。このようなパターンは、

(?=\w{6,10})\w+(?=abc)\w+です。

1

Wiktor第Stribiżewは否定後読みのために言う:彼が言ったことはありません

"\d+(?=\w{6,10})" == "(?=\w{6,10})\d+" 

を。彼の例は、具体的にはワード境界であり、長さ0のアサーションでもあります。のみ

…(?lookaround)\b… == …\b(?lookaround)… 

が保持できる。

なぜ"ad(?=abc)""(?=abc)ad"と等しくないのですか?

他の試みは(常に失敗した)開始でそれを主張しながら、1試合ad後にシーケンスabcをアサートするので。

関連する問題