2013-05-06 19 views
8

私はRegexの圧倒的な世界に全く新しいです。基本的には、Gedit APIを使用して、構文強調表示用の新しいカスタム言語仕様(C#から派生したもの)を作成しています(ByondのDM用)。 DMのエスケープ文字では、[変数]をエスケープ構文として使用する必要があります。これは簡単です。しかし、例えば[array/list [index]]のように入れ子にすることもできます。 (それは無限にネストすることができます)。他の質問を見てきました。ネストされた括弧について質問するとき、ネストされたものだけを意味するのに対し、この場合は/またはどちらかです。正規表現(正規またはネストされたかっこ)

いくつかの試みは、私が試した:

  • \[.*\] "は、試験[試験[試験]試験]試験[テスト]テスト"
  • \[.*?\]が結果を生成する結果を生成する「テスト[試験[テスト]試験]試験[テスト]テスト "
  • \[(?:.*)\]produces結果" テスト[試験[試験]試験]試験[試験]テスト」
  • \[(?:(?!\[|\]).)*\]produces結果 "試験[試験[テスト]試験]試験[テスト]試験"。これはhttps://stackoverflow.com/a/9580978/2303154から派生していますが、上記のように、内部に角括弧がない場合にのみ一致します。

明らかに私はもっと複雑なマッチングでここで何をしているのか分かりませんが、少なくとも私は他のソースからの基本的な操作についてもっと理解しています。

+3

[このチュートリアル](http://www.regular-expressions.info/tutorial.html)を熟読することで、正規表現の世界は圧倒的に少なくなります。また、ネストされた構造は、通常正規表現が崩れるようになっています。.NETの正規表現のフレーバーとPCREは、無限のネストを処理できる構造をサポートしています。 –

+0

残念ながら、それはAPIなので、私は区別することはできないと思いますし、GeditがXMLのマッチングのために使うものを使わなければならないと思います。そして、それは私が見てきた主なチュートリアルの1つでした。 – Chaos7Theory

+0

3回目と4回目の試行が構文的に不正です(テスト文字列には何も一致しません)。私はそれらを修正した。 #3:あなたのバージョン '\ [(?:。*))\]'には二重の閉じ括弧があります。 '\ [(?:*)\]'は#1と同じです。 _non-capture group_ '(?:...)はここではっきりとした目的を果たしません。 #4:あなたのバージョン '\ [?:(?!\ [| \])。* \]'は、非捕捉グループ構文のスポーツ部分 - '?:' - に対応する角括弧 '(...)' ([?] \ [| \])。 '' [^ \] \ [] 'に単純化することができます(バックスラッシュは、 )。 –

答えて

1

@Chaos7Theoryから:

GtkSourceView's Specification Referenceを読めば、私はそれが特にPCREを使用していることを考え出しました。私はそれを鉛として使用しました。

それを掘り下げると、試行錯誤を通じて、私はそれがで動作するようになった:

\[(([^\[\]]*|(?R))*)\]

私は、これは将来的に他の誰かに役立ちます願っています。

+0

@ Chaos7Theory:これを研究して解決してくれてありがとう! @アレックス:適切な答えに移動していただきありがとうございます! –

関連する問題