匹配{{双大括号内的字符}的Java正则表达式

匹配{{双大括号内的字符}的Java正则表达式,java,regex,Java,Regex,我正在尝试匹配字符串中双花括号内的所有内容。我使用以下表达式: \{\{.*\}\} 一些例子: The{{dog}}不是猫。这与{{dog}正确匹配 然而, The{{dog}}是一个{cat}在第一次匹配之后匹配所有内容,而不是返回两个匹配。我希望它匹配两次,一次为{{{dog}},一次为{{{cat} 有人知道怎么做吗 谢谢。您必须使用非贪婪匹配: \{\{.*?\}\} 要匹配大括号之间的所有内容,请使用: \{\{(.*?)\}\} 贪婪的*匹配任何东西(断行除外),因此当字符串

我正在尝试匹配字符串中双花括号内的所有内容。我使用以下表达式:

\{\{.*\}\}
一些例子:

The{{dog}}不是猫。
这与{{dog}正确匹配

然而,
The{{dog}}是一个{cat}
在第一次匹配之后匹配所有内容,而不是返回两个匹配。我希望它匹配两次,一次为{{{dog}},一次为{{{cat}

有人知道怎么做吗


谢谢。

您必须使用非贪婪匹配:

\{\{.*?\}\}
要匹配大括号之间的所有内容,请使用:

\{\{(.*?)\}\}

贪婪的
*
匹配任何东西(断行除外),因此当字符串中有多个
}
时,它总是匹配最后一个
}
(如果两个
}
之间没有任何
\r
\n

试着使
*
匹配不情愿(ungreedy),如下所示:

\{\{.*?}}
没错,您不必逃避
}

你也可以这样做:

\{\{[^}]*}}

如果一个
{…}}
本身不能包含一个
}

你需要的是“非贪婪”修饰符-因此你的正则表达式是
\{.+?\}

试试
\{.\}

我相信这是因为你的模式是贪婪的


解释得很好。

试试这个,它对我很有用:

Pattern pattern = Pattern.compile("\\{\\{(.*?)\\}\\}");
Matcher matchPattern = pattern.matcher("The {{cat}} loves the {{dog}}");
while(matchPattern.find()) {
    System.out.println(matchPattern.group(1));
}

正则表达式使用贪婪算法(因此想要获取匹配的最大字符串)。这对你有帮助还是你还需要更多?这应该可以完成工作\{\{.*.\}\}如果你得到了答案,接受对你帮助最大的答案