Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式调整_Java_Regex - Fatal编程技术网

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:因为当您使用
*?
时,正则表达式引擎必须在每个字符上测试它不是
}
的情况,并记录回溯位置。当你用所有格量词(
*+
,我加了它)来使用
[^}]
时,正则表达式引擎知道他不必记录回溯位置,也不必尽可能地获取所有字符。因此速度更快。这里有更多信息:
[^}]
*?
快得多,所以为了完整起见,应该提到这一条(就像这个答案一样)。谢谢你的快速回复:)谢谢你的快速回复:)