2011-11-08 10 views
0

データを抽出します。しかし、次のパターンは両方のマッチを抽出しています。は、最初の発生のみ

最初の出会いを取得するにはどうすればよいですか?

+0

これは、http://stackoverflow.com/questions/2074452/regex-to-first-occurence-onlyの複製のようです。 – MetaEd

答えて

0

*はすべて一致し、境界付近で停止しないため、" text\n"の代わりに" text\nr#;\n\nr#;\n text2\n"を消費するという問題があります。

/#r;[\w\W]*?#r;/ 

非欲張り修飾子(*?)が動作するように、全体としての正規表現のためにちょうど十分一致する*が発生します。解決策は*怠惰にすることです。貪欲数量詞は、最初のトークンにできるだけ多くの回数を繰り返してみてください、と徐々にエンジンが全体的に一致するものを見つけるために、バックトラックとして試合を放棄します

http://www.regular-expressions.info/possessive.htmlは、より多くの情報を持っています。遅延量指定子は、最初にトークンを必要な回数だけ繰り返し、エンジンが正規表現を通してバックトラックして全体的な一致を見つけるように徐々にマッチを展開します。

+0

thnx a ton .. u guys rock – ahhmarr

0

これを試してください。

/#r;[\w\W](?=#r;)/ 
3

オプション最良の推奨オプションとして、以下の4を参照してください。

オプション1:先読みを使用し、非欲張りワイルドカード一致を使用せずに、あなたがこの正規表現を使用することができます。

/#r;.*?#r;/ 

これは一致します。

a pattern that starts with "#r;" 
followed by any number of characters, but the fewest possible 
followed by "#r;" 

オプション2:をか区切り文字の間にテキストだけを入れたい場合は、これを使用して検索から返された[1]項目を参照することができます:

/#r;(.*?)#r;/ 

"#r;text1#r;#r;text2#r;".match(/#r;(.*?)#r;/)[1] == "text1" 

あなたがここにアクションでそれを見ることができます:http://jsfiddle.net/jfriend00/ZYdP8/

オプション3:または、各#Rの前と後への改行が実際に存在する場合、 http://jsfiddle.net/jfriend00/ZYdP8/10/:あなたはここで働い見ることができます

/#r;\n(.*?)\n#r;/ 

:あなたが合うようにしようとしている事で、あなたは、この正規表現を使用します。

オプション4:はまた、あなたがいかなる種類の空白は、境界上の試合の一部にしたくない場合は(トムの提案を取って)、あなたはこれを使用することができます。

/#r;\s*(.*?)\s*#r;/ 

いるあなたをここで働いて見ることができます:http://jsfiddle.net/jfriend00/ZYdP8/12/

+0

私は '/#r; \ s *(。*?)\ s *#r;/'。これは一様な正規表現で、 '#r;'タグの間に空白が含まれている場合でも空白が含まれていない場合でも使用できます。 –

+0

@TomKnapen - 良い提案トム。私は、OPの空白に必要なものが不明であった。私はテキストに実際に改行があったのかどうか、また他の空白を試合の一部にしたいのかどうかはわかりませんでした。私はこの提案を私の答えの最後に加えました。 – jfriend00

+0

'。*? 'は複数行のシーケンスと一致しませんか? –

関連する問題