匹配

时间:2016-10-17 06:29:27

标签: java regex

我正在尝试使用java regex匹配特定的字符串模式。

我想找到像

这样的模式
{some stuff|other stuff}

我使用以下模式:

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

问题是当我有类似的东西时:

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

我匹配{some stuff|other stuff} {some stuff|other stuff}而不是{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");
}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

感谢您的回答,他们帮助我解决了我的问题。

答案 2 :(得分:0)

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

模式应该看起来像

\{(#\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));
}