2016-09-14 8 views
0

パターンが一致し、グループの最後の前に特定の単語がない場合のみ、キャプチャグループを受け入れるようにしています。明らかに、私はコンセプトが届かない、私はアプローチの#を試したし、どれも動作するようには思えません:文字列の最後の否定アサーションを修正する

https://regex101.com/r/iP2xY0/3 https://regex101.com/r/iP2xY0/4

かかわらず、私は何をすべきかの私のキャプチャグループが何かをキャプチャした場合、私の目標でありますパターンの中央に拒否語が存在し、一致が返されません。

RC:\*.*?(?P<Capture>(Bob|David|Ted|Alice))(?!Reject).* 
  • RC:*こんにちはボブ・スミス< \人>
  • RC:*こんにちはデビッド・ジョーンズ*注BLAのBLA < \人>
  • RC:*こんにちはテッドウォーレン*人\ <拒否Namegrouopを返すことになっている>

キャプチャ:

  • ボブ
  • デビッド
  • 「」

だから、「拒否」NameGroupキャプチャが発見された場合NameGroupと< Rejectが表示されますが何語の間であれば、それを<で終わるものが続くキャプチャ言いますない。

+0

https://regex101.com/r/iP2xY0/5は拒否と一致するだけです –

+0

@be_good_do_goodありがとう。私が探しているのは、String1では 'Bob '、String2では' David'、String3では何もマッチングされていないということです。 – user3649739

答えて

0

パターンの先頭にネガティブな先読みを入れることをおすすめします。これを最初にチェックあなたが拒否した場合単語があなたの文字列に存在し、それが存在しない場合のみ、それは文字列の残りの部分と一致するようにしようとしない:

(?!.*Rejected.*)RC:\*.*?(?P<Capture>(Bob|David|Ted|Alice)).*

https://regex101.com/r/iP2xY0/6

+0

それは実際にはうまくいく、私はこうして "負のルックアヘッド"と思う:)。私はそれが本当に正しいので答えを受け入れましたが、私はTimeoutsでそれを使用している方法で問題にぶつかります。私は2つの 'パイプ'を持っています。最初のパイプは、用語が表示されない場合は最初のパイプのキャプチャグループを使用し、そうであれば2番目のパイプを使用します。https://regex101.com/r/bU6cU6/1、ネガティブ先読み最初のパイプを修飾します。しかし、ネクストフレーズは実際にはテキストに約3k文字であり、タイムアウトを取得していますhttps://regex101.com/r/bU6cU6/2それを回避する手段があるのでしょうか、それとも単に先読みの機能ですか? – user3649739

+0

タイムアウトで奇妙なことは、最初のパイプがそれ自身で動作しないことを知るために正規表現が32ステップしかかからず、2番目のパイプが自分自身で動作することを知るための18ステップです。 Regexが何をしているのか分かりません。それは)最初のパイプ、32ステップ、拒否、2番目のパイプに移動する必要はありません、18ステップを受け入れる? – user3649739

+1

不要なバックトラックを減らすために、 'RC:'のあとに先読みを入れてください。 –

関連する問題