2010-11-19 9 views
1

私はコードフォーマッタを書いています。私は助けが必要です。私はコードブロックを見つけなければならず、正規表現を使いたいと思う。私は、フォーマットに必要なコードは次のように基本的になります。入れ子になったコードブロックを見つけるためのRegEx

私はで始まるブロックを見つける{で終わる}この式とすることができる午前
KEYWORD name { 
    word 
    word 
    ... 
} 

[{](.*?)[}] 

しかし、私は知りません式に"KEYWORD name"部分を追加する方法。どちらも、;,{および}以外の文字を含むカスタム文字列です。

もう1つの問題は、自分のコードブロックをネストできることです。私はその機能を追加する方法を知らない。

+0

コードブロックがネストできるかどうかわかりませんが、そうであれば、正規表現は機能しません。 – Jordi

+0

ああ!あなたが正しいです!私はまだそれをテストしなかった。しかし、彼らは入れ子にする必要があります... –

+0

(任意の深さまで)入れ子になるとすぐに、正規表現は使いにくくなります。厳密に言えば、入れ子構造体は規則的ではないため、正規表現とのマッチングには適していません。 現代の正規表現フレーバ(例えば、PCRE、Perl、.NET)は再帰的マッチングを可能にするが、Javaはそれらの間にはない。したがって、おそらく、この仕事のためにパーサーを構築/使用する必要があります。 –

答えて

3

あなたはただ行うことができます。

KEYWORD name {.*?} 

あなたは.が同様にあなたは複数行モードを使用する必要があります改行をマッチさせたいので。

KEYWORDname両方が;,{}以外の任意の文字を含めることができ、任意の文字列ですので:(。?+)(。?+)

[^;,{}]+\s+[^;,{}]+\s*{.*?} 
+0

うん!これはうまく動作します! –

2

\ S + \は({+ S *。? )}

これは、スペースではなく、1つ以上の空白文字、スペースではないもの、1つ以上の空白文字、およびコードブロックが続くものです。

KEYWORDだけ、それは次のようになります、のは、すべての文字、数字、アンダースコアを言わせて、大文字とnameを含めることができる場合:

([A-Z]+?)\s+([A-Za-z0-9_+?)\s+\{(.*?)\} 

なお、あなたのコードブロックを入れ子にすることができれば、あなた」この正規表現には問題があります。最初の{と最初の}の両方に一致します。

+0

ありがとうございます。しかしブロックは時々入れ子になっています。私はそれを速くするために正規表現を使用するthougt ... :-( –

関連する問題