2016-10-17 4 views
1

Ich versuche, eine bestimmte Zeichenfolge Muster regex java anzupassen.Regex identische Strings auf der gleichen Linie passend

Ich möchte Muster finden, wie

{some stuff|other stuff} 

ich folgendes Muster verwende:

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

Problem ist, dass, wenn ich so etwas wie:

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

Ich bin passend {some stuff|other stuff} {some stuff|other stuff} und nicht zwei Vorkommen von {some stuff | other stuff}.

Ich denke, das irgendwie mit dem regex Rückzieher verwandt ist, aber ich habe keine Ahnung, wie man um ihn zu bekommen.

Irgendwelche Ideen?

Mein Java-Code:

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

was ist mit einem zweiten Muster das Spiel gesplittet haben? –

+0

Was ist 'Schlüssel'? Welche genaue Ausgabe brauchst du (zB für '{einige Sachen | andere Sachen}})? Bitte zeigen Sie das reale Beispiel. –

+0

Diese Frage ist unklar.Geben Sie einige konkrete Beispiele für Strings, die Sie abgleichen möchten, und die erwarteten Übereinstimmungsgruppen an. –

Antwort

0

können Sie string.matches("({"+key.replace('.',"\\.").replace('|',"\\|")+"|(.*)})+") verwenden.

0

Mit (\\{#" + key + ")(\\|)(.+?}) als Muster mein Problem gelöst. Ich habe nicht berücksichtigt, dass meine Suche gieriges Verhalten hatte.

Vielen Dank für Ihre Antworten, die sie mir geholfen, mein Problem zu lösen.

+0

Es wird nicht funktionieren, wenn Ihr 'Schlüssel' sagt:' # my * key'. Oder, wenn der Teil nach '|' einen Zeilenumbruch enthält. –

0

können Sie verwenden ein *-Pattern.quote -quantified die Variable Zeichenfolge dem Muster negierte Zeichenklasse [^}]* und vergessen Sie nicht passieren als eine Folge von wörtlichen Zeichen verwendet werden.

sollte das Muster aussehen

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

die regex demo See.

Einzelheiten:

  • \{ - eine wörtliche {
  • (#\Qmy.key\E) - Gruppe 1 eine wörtliche my.key
  • \| erfassen - eine wörtliche |
  • ([^}]*) - Gruppe 2 Capturing 0+ verkohlt andere als }
  • } - eine wörtliche }

Siehe 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)); 
} 
Verwandte Themen