2016-04-17 12 views
0

を避ける:が、私はこのような何かに見える文字列持って予想外の試合に

<text>bla bla BLU bla bla</text> 
<text>bla bla bla bla bla</text> 
<text>bla BLU bla bla bla</text> 
<text>bla ble bla bla bla</text> 

を、私はその中BLU<text>エントリを取得する方法を探しています。私は、この正規表現使用してみました:

/<text>[\s\S]*?BLU[\s\S]*?<\/text>/g 

を予想通り、私は、2試合を得るが、2試合目は次のようになります。私は試合のこの種を回避し、これだけの結果を取得できますか

<text>bla bla bla bla bla</text> 
<text>bla BLU bla bla bla</text> 

2試合目のように:

<text>bla BLU bla bla bla</text> 
+0

何か非常に単純な点の合計点の半分を提供していますか? ' [^ <] * BLU [^ <]*' – sln

答えて

1

あなたのロジックの床があります。

この理由は、[\s\S]*が遅延していても、BLUが見つかるまで続きます。これは、開封<text>タグを見つけて、閉鎖先を越えて次の行に進み、BLUが見つかるまで意味します。

次の正規表現を試すことができます:私は変更

<text>(?:(?!<\/text>)[\s\S])*?BLU[\s\S]*?<\/text> 

ビットは(?:(?!<\/text>)[\s\S])*?に、[\s\S]*?ました。

[\s\S]は、非捕捉グループ内に囲まれている。グループの先頭には、負の先読みがあり、終了が見つかると失敗します。</text>

このように、[\s\S]*?は決して</text>と一致しないため、問題が解決されます。

Live Demo on Regex101

Demo


開口部と<text>タグと終了タグの間に改行が存在しない場合は、次の正規表現を使用できることに注意してください:

<text>.*?BLU.*?<\/text> 

Live Demo on Regex101

+2

あなたはそれを正しく解釈しました++ – anubhava

+3

@anubhavaありがとう! – Druzion

+0

あなたはまた、あなたの '(?:<\/text>)[\ s \ S])*?BLU [\ s \ S] *? <\/text>はかなり効率的ではありません。 –

関連する問題