2017-02-06 12 views
0

次式のオーバーフローまで後戻りします。正規表現は、Java

一致する文字列が同様とすることができる:これはこれはFEATURE

のジャンク線

の#ifdef機能
#endifの//端で

迷惑行

#ifdefのFEATURE

これが一致しなければならないジャンクラインです:HOLasduiqwhei & // FEATURE #endifの//時間

#endifの機能

fjfefjこれは迷惑行

したがって、太字の文字列は一致する必要があります。エラーは以下のようになります。

at java.util.regex.Pattern$GroupHead.match(Unknown Source) 
    at java.util.regex.Pattern$Loop.match(Unknown Source) 
    at java.util.regex.Pattern$GroupTail.match(Unknown Source) 
    at java.util.regex.Pattern$Curly.match1(Unknown Source) 
    at java.util.regex.Pattern$Curly.match(Unknown Source) 
    at java.util.regex.Pattern$Slice.match(Unknown Source) 
    at java.util.regex.Pattern$GroupHead.match(Unknown Source) 
    at java.util.regex.Pattern$Loop.match(Unknown Source) 
    at java.util.regex.Pattern$GroupTail.match(Unknown Source) 
    at java.util.regex.Pattern$Curly.match1(Unknown Source) 
    at java.util.regex.Pattern$Curly.match(Unknown Source) 
    at java.util.regex.Pattern$Slice.match(Unknown Source) 
    at java.util.regex.Pattern$GroupHead.match(Unknown Source) 
    at java.util.regex.Pattern$Loop.match(Unknown Source) 
    at java.util.regex.Pattern$GroupTail.match(Unknown Source) 
    at java.util.regex.Pattern$Curly.match1(Unknown Source) 
    at java.util.regex.Pattern$Curly.match(Unknown Source) 
    at java.util.regex.Pattern$Slice.match(Unknown Source) 
    at java.util.regex.Pattern$GroupHead.match(Unknown Source) 
    at java.util.regex.Pattern$Loop.match(Unknown Source) 
    at java.util.regex.Pattern$GroupTail.match(Unknown Source) 
    at java.util.regex.Pattern$Curly.match1(Unknown Source) 
    at java.util.regex.Pattern$Curly.match(Unknown Source) 
    at java.util.regex.Pattern$Slice.match(Unknown Source) 
    at java.util.regex.Pattern$GroupHead.match(Unknown Source) 
    at java.util.regex.Pattern$Loop.match(Unknown Source) 
    at java.util.regex.Pattern$GroupTail.match(Unknown Source) 
    at java.util.regex.Pattern$Curly.match1(Unknown Source) 
    at java.util.regex.Pattern$Curly.match(Unknown Source) 
    at java.util.regex.Pattern$Slice.match(Unknown Source) 

バックトラック回避戦略/表現の改善は歓迎されます。私は原子群(?>)を試しましたが、何らかの理由で単純化しません。

コードは以下の通りです:

パブリック文字列のストリップ(文字列テキスト){

ArrayList<String> patterns=new ArrayList<String>(); 
    patterns=readFile("Disabled_Features.txt"); 
    for(int i = 0; i < patterns.size(); ++i) 
    { 

     Pattern todoPattern = Pattern.compile("^#ifdef "+patterns.get(i)+"((?:\\r?\\n(?!#endif (?:// end of)?"+patterns.get(i)+"$).*)*)\\r?\\n#endif (?:// end of)?"+patterns.get(i)+"$",Pattern.MULTILINE); 

     Matcher m = todoPattern.matcher(text); 
     text = m.replaceAll(""); 
    } 
    return text;   
} 
+0

[この正規表現のデモ](https://regex101.com/r/9n7HPJ/1)を確認してください。 –

+0

こんにちは、あなたの表現はまだ私にオーバーフローを与えます。 – Jackson

+0

正規表現に一致するコードを投稿してください – freedev

答えて