2016-10-17 36 views
1

我想匹配使用java正则表达式的特定字符串模式。正则表达式相同的字符串匹配

我想找到的图案像

{some stuff|other stuff} 

我现在用的是以下模式:

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

问题是,当我有类似:

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

我匹配{some stuff|other stuff} {some stuff|other stuff}而不是2次{some stuff | other stuff}。

我认为这是与正则表达式回溯有关,但我不知道如何解决它。

任何想法?

我的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

什么是钥匙?你需要什么确切的输出(比如说,“{some stuff | other stuff}”)?请展示真实的例子。 –

+0

这个问题目前还不清楚。请提供一些您想要匹配的字符串以及预期的匹配组的具体示例。 –

回答

0

您可以使用string.matches("({"+key.replace('.',"\\.").replace('|',"\\|")+"|(.*)})+")

0

使用(\\{#" + key + ")(\\|)(.+?})作为模式解决了我的问题。我没有考虑到我的搜索行为很贪婪。

谢谢你的回答,他们帮我解决了我的问题。

+0

如果你的'key'是说,'#我的*键',它将不起作用。或者,如果'|'后面的部分包含换行符。 –

0

您可以使用*-量化否定字符类别[^}]*,并且不要忘记将您传递给模式的变量字符串用作字面字符序列。

模式应该像

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

regex demo

详细

  • \{ - 字面{
  • (#\Qmy.key\E) - 第1组捕获字面my.key
  • \| - 字面|
  • ([^}]*) - 组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)); 
} 
相关问题