1

これと同様の質問をしたところ、優れた正確な回答がありましたが、まったく新しい問題があることがわかりました. 関連する入力が1行あることがわかりました。これを抽象的な方法で尋ねる方法がわからないので、すぐに入力にジャンプします。

(より良い例を提供するために編集)

bear999bear888bear777bear666fox---bear222bear333bear444bear555fox

(マーカー間のアイテムは必ずしも数値ではありません)

これは式です(更新された入力例に一致するように編集されています):

bear.*bear(?<matchString>(.(?!bear.*bear))*?)bear.*fox

444を返しています。これを微調整して444 と 777の両方を返す方法はありますか? 最初の一致をスキップして、後者のみを優先しているようです。私は持っています!除外して、左側の最も内側のみに一致するようにします。

私はここでテストしています: http://regexlib.com/RETester.aspx

これは、2 行に分割して複数行をオンにするとうまく機能します。入力が 1 行であると動作しなくなるのはなぜですか?

アドバイスをいただければ幸いです。

4

2 に答える 2

1

これは機能するはずです(質問でリンクした正規表現テスターで機能します):

(?<=bear)(?:(?!bear).)*(?=bear(?:(?!bear).)*fox)

bear「前に があり、中にシーケンスがなく、-no-bearシーケンスが続くものに一致させましょう」のように読みます。bearbearfox

ここには捕獲グループはありません。試合全体が必要です。

そして、はい、実際にはトークナイザーの作業のように見えるのに、なぜこれを単一の正規表現で行う必要があるのか​​ 疑問に思わずにはいられません。) たとえば、'fox'最初に行を分割し、次に各部分を'bear'- で分割し、各結果の最後の部分の前のものを取ることができます。

于 2012-10-17T00:48:24.700 に答える
0

あなたの最初.*は貪欲です。これはうまくいきます:

xxx.*?xxx.*?xxx(?<matchString>.*?)xxx.*?yyy
于 2012-10-16T23:07:57.510 に答える