2016-07-25 6 views
2

は続いており、この場合には、私が唯一の第三リアルに一致するようにしたいです。私は先読みregex:なぜこのネガティブな先読みが機能しないのですか?私は今、私は<code>::</code>せずに本当のものと一致し、この</p> <pre><code>real:: a real :: b real c </code></pre> <p>のようなテキストが欲しいいる

real\s*(?!::) 

で正規表現を試してみました。しかし、これは\s*のために

real :: b 
real c 

に一致するreal :: bが一致している理由は、ゼロ個以上の\sを意味? Wiktor第Stribiżewへ

更新

感謝。 regex101デバッグツールを使用します。 backtrackが複雑になることがわかります。

私は似ていますが、私は再び

real (xx(yy)) :: a 
real (zz(pp)):: b 
real (cc(rr)) c 

を解決することはできません別のタスクを思い付いた、私は::次のようなしているreal (cc(rr))をマッチさせたいです。

real\s*\(.*?\)+(?!\s*::) 

これは私が試したものですが、失敗しました。正規表現のデバッグを見て、それはまたバックトラックのためです。しかし、これを正しく行う方法は?

答えて

5

あなたは先読みに\s*を配置する必要があります。

real(?!\s*::) 

が、その後real一致real、その後、\s*試合0以上の空白、先読みのでregex demo

real\s*(?!::)試合realを参照してください。 ::とエンジンバックトラックで一致しません。つまり、と一致するスペースが解放されます。を削除し、文字列の再一致を試みます。 \s*は空の文字列と一致できるため、:: bより前のrealが一致します。

regex debugger scheme at regex101が舞台裏で何が起こっているかを示す参照してください:

enter image description here

+0

OKでない何かに続いてゼロスペースをrealのマッチングですが、私の正規表現が失敗なぜあなたは説明できますか? – user15964

+0

先読みの外側にある '\ s * 'が2番目のケースと一致する理由を説明し、プロセスを示すregex101のグラフを追加しました。 –

+0

@ user15964アサーションは「ネガティブルックアヘッドアサーション」です。これは、コンテンツが配置された場所の直後にコンテンツが表示されないことを主張します。 –

-1

は、あなたの正規表現は失敗している理由を理解することhttps://regex101.com/r/yP3xV9/1を参照してください。

基本的には、::

関連する問題

 関連する問題