2016-08-02 4 views
0

と一致します。 私はAtomテキストエディタのシンタックステーマに取り組んでいます。私はコードのブロックに一致する必要があります。用
例えば 、TextMateはコードブロック

{ //何らかのコード }

I can do this by using 
"begin": "(for){" 
"end": "}" 
"patterns": [//some patterns] 

問題がループのためのこの内部Iは、コードの別のブロックを有することができることである(例えば、もし{}) "if"の括弧は "for"ブロックの終わりと一致します。
回避策はありますか?なぜなら、私はこのブロックの中だけで特定のパターンを使う必要があるからです。いくつかの回避策はあり

+0

[ここに多分](http://stackoverflow.com/search?q=regex+matching+brace) –

答えて

1

を仮定すると、そこにループのために、あなたは私はあなたが使用している正規表現エンジンについては何も知らない(次のパターンを使用することができます内部のブロックをネストされたが、されません。そのパターンはほとんどで動作するはずです):

'\{[^{}]*)([^{}]{[^{}]*})*?[^{}]*YOURPATTERNS([^{}]{[^{}]*})*+[^{}]*+\}' 

はのは、それを解凍してみましょう:
それは開口部ブラケットで始まり、できるだけ多くの非括弧文字と続きます。その後、必要に応じて、開きブラケット+スタッフ+閉じブラケットのペアが続きます。その後、ループ内で一致させたいパターンが来る可能性があります。次に、残りの可能な対の開閉ブラケットが続きます。それ以外の残りのブラケット文字は、閉じ括弧にギャップを囲むようになります。

ネストされた括弧
あなたは、ネストされたブラケットを必要とするので、あなたは再帰的なパターンをサポートして非常に強力な正規表現エンジンを使用する必要があります。私はPythonのregexモジュール(reモジュールではありません)を使ってこのケースのために何かを書いています。次のように動作します。再帰を伴う別のエンジンを使用する場合は、それを適合させる必要があります。それ以外の場合は問題ありません。

r'\{(?P<any>[^{}]*)(?P<pairs>(?P<posany>[^{}]*+)\{(?&pairs)*?(?&posany)\})*?(?&any)YOURPATTERNS(?&pairs)*+(?&posany)\}' 
+0

生憎、私はブロックを入れ子にしている、それがためのループの内側 –

+0

ネストされたものの問題は? –

+0

yeesたとえば、私は別のforループまたはif文を持つことができます –

関連する問題