2016-10-17 7 views
1

java regexを使用して特定の文字列パターンと一致させようとしています。同じ行のRegexの同一文字列

私は次のパターンを使用しています

{some stuff|other stuff} 

のようなパターンを見つけたい:

text...  {some stuff|other stuff} {some stuff|other stuff} more text 

私は一致しています:

"(\\{#" + key + ")(\\|.*)[^\\}]" 

問題は、私のようなものを持っている場合ということです{some stuff|other stuff} {some stuff|other stuff}、{some stuff | other stuff}の2回の出現ではありません。

私はこれが何とか正規表現のバックトラックに関係していると思いますが、私はそれを回避する方法について考えていません。

アイデア?

私のJavaコード:

Pattern pattern = Pattern.compile("(\\{#" + key + ")(\\|.*)[^\\}]"); 
Matcher m = pattern.matcher(string); 

while (m.find()) { 
    logger.info(m.group(0)); 
    //logger.warn("Parameter " + key + " is not found"); 
    // throw new Exception("Parameter " + key + " is not found"); 
} 
+0

マッチが分割さ持っている第二のパターンについて何? –

+0

'key'とは何ですか?正確な出力は何でしょうか(例えば、 '{some stuff | other stuff}')?実際の例を示してください。 –

+0

この質問は不明です。一致させる文字列の具体的な例と期待されるマッチグループを入力してください。 –

答えて

0

あなたはstring.matches("({"+key.replace('.',"\\.").replace('|',"\\|")+"|(.*)})+")を使用することができます。

0

(\\{#" + key + ")(\\|)(.+?})をパターンとして使用すると、私の問題が解決しました。私は自分の検索が貪欲な行動を取っていることを考慮しなかった。

私の問題を解決するのに役立ちましたあなたの答えに感謝します。

+0

あなたの 'key'が'#my * key'と言うなら、それは動作しません。あるいは、 '|'の後の部分に改行が含まれているとします。 –

0

*量子化された無効な文字クラス[^}]*を使用して、Pattern.quoteをリテラル文字のシーケンスとして使用するパターンに渡す可変文字列を忘れないでください。パターンは

\{(#\Qmy.key\E)\|([^}]*)} 

のようになります

regex demoを参照してください。

詳細

  • \{ - リテラル{
  • (#\Qmy.key\E) - リテラルmy.key
  • \|
  • をキャプチャグループ1 - リテラル|
  • ([^}]*) - グループ2捕捉が0+他の文字}
  • } - リテラル}

online Java demoを参照してください:

String key = "my.key"; 
String s = "text...  {#my.key|other_stuff} {#my.key|new\nstuff} more\ntext"; 
Pattern pattern = Pattern.compile("\\{(#" + Pattern.quote(key) + ")\\|([^}]*)}"); 
Matcher m = pattern.matcher(s); 
while (m.find()) { 
    System.out.println("--- Match found ---"); 
    System.out.println(m.group(0)); 
    System.out.println(m.group(1)); 
    System.out.println(m.group(2)); 
} 
関連する問題