2016-11-28 5 views
1

エスケープされていない閉じた括弧ではなくすべてを含むことができる括弧の間の式を抽出する必要があります。範囲からエスケープされた文字を除外します

例えば、[aaa\]bbbbbb]の正規表現は、結果としてaaa\]bbbbbbを与える必要があります。

私はこれを試しました:\[([^(?<!\\)\]]*)\]しかしそれは失敗します。

ヒント

+0

恐縮です、ありがとう! – sssimon

答えて

1

あなたは使用することができます

\[([^\]\[\\]*(?:\\.[^\]\[\\]*)*)] 

か - が存在する可能性がある場合、任意の非エスケープの間で-[を、取り出し\[(例えば[a[\[aa\]bbbbbba\[aabbbbbb][エスケープ非と]

\[([^\]\\]*(?:\\.[^\]\\]*)*)] 

regex demo 1およびregex demo 2を参照してください。正規表現\[((?:[^][\\]|\\.)*)]unrolled variantです。

詳細

  • \[から[
  • ([^\]\[\\]*(?:\\.[^\]\[\\]*)*) - グループ1つの捕捉:
    • [^\]\[\\]*から[以外のゼロまたはそれ以上の文字、]及び\(いくつかの正規表現のフレーバーあなたはエスケープなしで書くことができます - [^][\\]*
    • (?:\\.[^\]\[\\]*)* - ゼロ以上の配列:
      • \\.は -
    • [以外のゼロまたはそれ以上の文字、 ]\ - 任意の配列( \および改行文字
    • [^\]\[\\]*以外の任意の文字をエスケープ
  • ] - 閉鎖]
+0

あなたの正規表現は '[a [\ [aa \] bbbbbba \ [aabbbbbb]'(括弧内に別のカッコで囲んだもの)のようなものに対して失敗します – Aserre

+0

@Aserre :もちろん、エスケープされていない '['と ']はバランスが取れていないからです。 OPにおけるこれらのシナリオのために何が行動すべきかは言及されていない。 –

+0

'エスケープされていない閉じた括弧ではないすべてを含めることができる括弧の間に式を抽出する必要があります。 ' – Aserre

0

これは動作します(と思う)、最も単純な正規表現である:グループ1

として括弧のテキストをキャプチャ

\[(.*?)(?<!\\)\] 

live demoを参照してください。

関連する問題