2016-07-19 13 views
1

私は何かを知っていると思っていました。 私がしようとしているのは、マルチストリングネガティブな先読みですか?それは事ですか? 基本的には、3番目の文字列が存在するのは見つかっていますが、2つの前駆文字列は存在しません。RegEx .NETの一致文字列Cここで文字列AまたはBは存在しません

(?i:<!((yellow thing)\s(w+\s+){0,20}(blue thing))\s(\w+\s+){0,100}(green thing)) 

対象文字列:

  • ここでは、黄色のものを持っています。ここには青いものがあります。明らかに緑色のものは最高です。 (一致しないでください)
  • 死の棒を購入したいですか?私は緑のものを持っています。 (MATCH)
  • 私たちは黄色い物の潜水艦にいるのですか?そこの緑色のものを見てください! (MATCH)
+0

あなたは後読みを台無しにし、インライン修飾子を持つオプショングループにそれを回しました。黄色の物\ W *(\ w + \ W +){0,20} \ W *青い物\ W *(\ w + \ W +){0,100})緑の物を試してください。ワード境界は単語全体にマッチするように「もの」の周りに追加することができます。 –

答えて

0

これを試してみてください:

^(?:(?!\byellow thing\b.*?\bblue thing\b).)*\bgreen thing\b 

デモ:https://regex101.com/r/dL0uZ1/2

説明: "緑の事" のための

  • 見て(それマーク単語の境界の周り\b年代)
  • ただし、テキストliの先頭から見て2つの他の文字列が先行しない場合のみしたがって、^の後に「パターンを含まない文字列」パターンが続きます(詳細はRegular expression to match a line that doesn't contain a word?を参照してください)。
0

私は無限の幅の負の後読みを使用して、文字列全体ではなく、文字列内cと一致する試みとして、質問を理解しています。

?の直後にi:を挿入すると、lookbehind構造が損なわれ、「単語」の間に単語以外の文字がある可能性があります。

したがって、あなたは

(?<!yellow thing\W*(?:\w+\W+){0,20}\W*blue thing\W*(?:\w+\W+){0,100})green thing 

を必要とするが、私はこれらの間の一致オプションの単語の数をエミュレートするために数字を追加regex demoを参照してください。

thingの周りに単語の境界を追加して、それらを単語全体として一致させることができます。これは要件によって異なります。

また、すべてのキャプチャグループ(\w+\W+)を非キャプチャにすると、これらのグループスタックをフリーに保つことができます(これらのグループのキャプチャを追跡する必要はありません)。キャプチャする必要がある場合は、キャプチャグループをそのままにしてください。

結果:

enter image description here

+0

ああ!非常に素晴らしい。私は自分のやり方の誤りを見ます。ありがとうございます。 また、?iは大文字小文字を無視するため使用しました。 (?i:黄色のもの\ W *(\ w + \ W +){0,20} \ W *青いもの\ W *(\ w + \ W +){0,100})緑色のもの) – Brenticus

+0

'Regex'メソッドでパターンを使うときは' RegexOptions.IgnoreCase'フラグを使います。 –

+0

それはあなたのために働いてうれしい。回答を受け入れることを検討してください([回答を受け入れる方法](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)を参照)。 –

関連する問題