2017-01-14 14 views
1

私の正規表現は本当に私が望むことをしていません。パターンはこれを行います正規表現のパターンに一致するパターン

func anyword() { 

が、私はそれが次の}に停止する:それはラインで始まる、私のテキストファイル内のすべての一致を見つける必要があります。しかし、このの一つ以上の場合は、表示されます:

SomeFunction(); 

それは次の}をスキップする必要があります。

ここでは、スキャンするテキストの例を示します。各行が、それはそこに何をすべきかを表示するようにコメントしている:これは私が現在使用しているパターンです

override func something() { // here is a start pattern 
           // still looking for an } 
halloworld() { };    // bracket } found but is ignored because line also contains "()" 
           // still looking for an } 
           // still looking for an } 
}        // found closing bracket } end of match 

\w+\s+func\s\w+\(\)\{\s+(.*?)\s+\} 
+1

regexは、任意の数のネストされた構造を照合するためのものではありません。しかし、正規表現を増やすだけで、それを行うことができます:https://msdn.microsoft.com/en-us/library/bs2twtah(v=vs.110).aspx#balancing_group_definition – sweaver2112

答えて

2

多分.NET Balancing Groups{}のHそれらの厄介なネストされた、未知のレベル:

\bfunc\s*\w+\([^)]*\)\s*{(?:[^{}]|(?<Open>{)|(?<-Open>}))*(?(Open)(?!)\} 

クールな部分は、それがに変換(?:[^{}]|(?<Open>{)|(?<-Open>}))*(?(Open)(?!)ある:いずれか食べる一つの非{}、又は{を食べる、}により、最終的に、第三のオプションに従っ3方向交互(マイナス記号に注意してください、名前は関係ありません)、これはスタックをポップし、グループを "閉じます"。このサブパターンは、*のためにできるだけ多くの回数自由に一致しますが、{は同じ番号の}で一致する必要があります。パターンが最後の条件で失敗すると、「開く」グループがチェックされますまだ一致している場合は、空白の先読みを実行して、すべてを失敗させることが保証されます。

+0

文字列の先頭に 'func'を指定すると"^"が指定されますが、与えられたサンプルデータでは、文字列の先頭に*ではありません。 – Abion47

+0

"行は" => 'RegexOptions.Multiline'で始まります – sweaver2112

+0

サンプルデータがその感情にはっきりと一致しないため、明確化が必要です。 – Abion47

0

可能な解決策は、これは、あなたが単一の行を使用する必要が改行にマッチするドットのマッチング:

func\s*.*\s*{\n.*?((?!\{.*\}).)*} 

ここでは、funcキーワードと最初の改行を一致させます。次に、その行の別の開き括弧とそれに続くあなたが探している閉じ括弧を許可しないネガティブな先読みを使用します。

さらに開閉括弧をネストすることもでき、最後の閉じ括弧に一致します。

はあなたが唯一のネストされた括弧の単一レベルがあるように起こっている場合はthis question

+1

私はこれを[Regex101]に入れます( https://regex101.com/r/So2MRV/1)、それは何も一致しません。 – Abion47

+0

@ Abion47 https://regex101.com/r/hXdRNe/2 – freinn

+0

https:// regex101。com/r/NvZJ7n/1 – Abion47

0

を参照してください、それ詳細についてhere

をテストすることができ、その後、このパターンは、あなたのために働く必要があります。

\w[\w\s]+func[\w\s()]+({(?:[^{}]*|[\w\s();]*?{[\w\s();]*?}[\w\s();]*?)*}) 

See it implemented on Regex101.

関連する問題