Java正则表达式调整
我不太擅长正则表达式,所以我一直在四处寻找帮助 我需要的是拉任何封装在双大括号{{}内的字符串。例如,我有一个字符串值,如下所示:Java正则表达式调整,java,regex,Java,Regex,我不太擅长正则表达式,所以我一直在四处寻找帮助 我需要的是拉任何封装在双大括号{{}内的字符串。例如,我有一个字符串值,如下所示: String text = "This is my sample {{text1}} text {{text2}}."; 这是我的正则表达式: String regex = "\\{\\{.*\\}\\}"; 这就是我对代码所做的: Pattern p = Pattern.compile(regex); Matcher match = p.matcher(tex
String text = "This is my sample {{text1}} text {{text2}}.";
这是我的正则表达式:
String regex = "\\{\\{.*\\}\\}";
这就是我对代码所做的:
Pattern p = Pattern.compile(regex);
Matcher match = p.matcher(text);
while (match.find()) {
System.out.println(match.group());
}
我需要的输出是:
{{text1}}
{{text2}}
但我认为正则表达式正在查找和定位字符串值的两端,因为它会返回以下结果:
{{text1}} text {{text2}}
当我打印出值时。我应该如何调整我的正则表达式来捕获我需要的东西
另外,我不知道任何给定字符串中会有多少个{{text}},这是一个2的示例,但可能有任何数字,甚至可能根本没有。您可以使用这样的特殊字符类而不是点:
String regex = "\\{\\{[^}]*+\\}\\}";
换句话说,[^}]
表示除}
或者您可以使用惰性量词,但其性能较差:
String regex = "\\{\\{.*?\\}\\}";
您必须在单行模式下工作。您可以使用这样的特殊字符类,而不是点:
String regex = "\\{\\{[^}]*+\\}\\}";
String regex = "\\{\\{.*?\\}\\}";
换句话说,[^}]
表示除}
或者您可以使用惰性量词,但其性能较差:
String regex = "\\{\\{.*?\\}\\}";
您必须在单线模式下工作
String regex = "\\{\\{.*?\\}\\}";
注意*
后面的?
。这使得它不贪婪。当前发生的情况是,正则表达式正在查找第一个{{
,然后一直查找最后一个}
,因为它是“贪婪的”
注意
*
后面的?
。这使得它不贪婪。当前发生的情况是,您的正则表达式正在查找第一个{{
,然后一直到最后一个}
,因为它是“贪婪的”。+1用于建议[^}]
。这是一个比这里的*?
好得多的选择。感谢您的快速回复:)为什么这是一个更好的选择X@Wakka02:因为当您使用*?
时,正则表达式引擎必须在每个字符上测试它不是}
的情况,并记录回溯位置。当你用所有格量词(*+
,我加了它)来使用[^}]
时,正则表达式引擎知道他不必记录回溯位置,也不必尽可能地获取所有字符。因此速度更快。这里有更多信息:[^}]
比*?
快得多,所以应该提到这一点只是为了完整性(就像这个答案一样)。+1建议使用[^}]
。这是一个比这里的*?
好得多的选择。感谢您的快速回复:)为什么这是一个更好的选择X@Wakka02:因为当您使用*?
时,正则表达式引擎必须在每个字符上测试它不是}
的情况,并记录回溯位置。当你用所有格量词(*+
,我加了它)来使用[^}]
时,正则表达式引擎知道他不必记录回溯位置,也不必尽可能地获取所有字符。因此速度更快。这里有更多信息:[^}]
比*?
快得多,所以为了完整起见,应该提到这一条(就像这个答案一样)。谢谢你的快速回复:)谢谢你的快速回复:)