我正在尝试使用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");
}
答案 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组捕获除}
}
- 文字}
请参阅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));
}