2011-09-09 12 views
8

私は正規表現はこれらのすべてを一致させたいです210およびjklである。正規表現オプション先読み

私は以下のケース1と3で動作しますが、ルックアヘッドをオプションにすることに問題があります。

(?<=start).*(?=end.*) 

編集:

うーん。悪い例。実際には、中央のビットは数字ではありませんが、文字の特定のセットが先行し、オプションでそれに続くことがあります。私は要求に応じて入力と出力を更新し、someonesの質問に応答して第4の例を追加しました。それはオプションだ場合は、一致した場合、それは大丈夫だ

、それが一致しない場合、それはまた、大丈夫だ:

答えて

8

でそれを参照してください、多分あなたはここに先読みをしたくないように、あなたが実際に非貪欲.*?を望んでいるようです。

(?<=start).*?(?:end)?$ 

私の推測では、あなたが"start123end"のようなものにマッチしようとしているということですが、endまたはstartがマッチしたテキストに表示したいので、あなたが制限するためにそこに前後参照アサーションを持っていません通常は貪欲である.*です。

代わりに、貪欲でないバリアントを使用して、パターンの右端を$で固定することができます。

(あなたがキャプチャグループを使用することができるしている場合あるいは、あなただけの代わりにそれを行う必要があります。

start(.*?)(end)?$ 

してからちょうど最初のキャプチャグループから値を取得します。)

1

オプションの先読みは意味がありません。先読みはマッチを延長しないので、それは全く効果がありません。

したがって、オプションの先読みの構文は空の文字列です。

+0

オプションの接尾辞を付けずに真ん中のビットを返す必要があります。 –

+0

'start456otherstuff'と一致するはずですか? –

+0

いいえ、start456endotherstuffと一致する必要がありますが、456だけ戻します。 –

0

なぜ先読みが必要ですか?

start(\d+)\w* 

は行間を読むしようとするとrubular

5

多分このような:

(?<=start).*?(?=(?:end|$)) 

これは、「開始」と「終了」または行の終わりまで、さらに数量詞は、非貪欲である必要があります(.*?

見るまで一致しますit here on Regexr

Regexrの例を数字だけでなく、

2

Lookaheadだけでは仕事ができません。これを試してみてください:単語の後

(?<=start)(?:(?!end).)* 

後読みポジションあなたが「開始」、それの残りの部分は(は含まない)まで、すべて「終わり」の次の発生を消費します。

はここだdemo on Ideone.com

1

「終わり」は常に存在することが起こっている場合には、使用: (?<=start)(.*?)(?=end)あなたはOPに入れて。 "先読みをオプションにする"と言うので、 "終わり"や改行が終わるまで実行してください。 (?<=start)(.*?)(?=end|\n)。あなたが "終わり"グループを捕まえるのを気にしないならば、先読みをスキップして、そこにあれば "開始"の後に始まり、そこにあれば "終わり"の前に止まる(?:start)?(.*?)(?:end)?を行うことができます。これらのパイプされた "または"パターンのうち、より多くを使用することもできます:(?:start|^)および(?:end|\n)

関連する問題