如何在Java中匹配适当的大括号(使用正则表达式)
我希望匹配由大括号(如何在Java中匹配适当的大括号(使用正则表达式),java,regex,string,pattern-matching,backreference,Java,Regex,String,Pattern Matching,Backreference,我希望匹配由大括号({})括起的字符串中的部分,并返回大括号中的内容。 大括号内的内容也可以包含“嵌套”大括号,这使得匹配正确的右大括号非常重要。 因此,如果打开了另一个大括号,则应忽略以下闭合大括号 作为起点,我使用了以下代码,它应该将字符串Stuff@upper{foo{bar}baz}{end}转换为Stuff foo{bar}baz{end}: package com.stackoverflow; import java.util.regex.Matcher; import java.
{}
)括起的字符串中的部分,并返回大括号中的内容。
大括号内的内容也可以包含“嵌套”大括号,这使得匹配正确的右大括号非常重要。
因此,如果打开了另一个大括号,则应忽略以下闭合大括号
作为起点,我使用了以下代码,它应该将字符串Stuff@upper{foo{bar}baz}{end}
转换为Stuff foo{bar}baz{end}
:
package com.stackoverflow;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExBraces {
public static void main(String[] args) {
String string = "Stuff @upper{foo {bar} baz} {end}";
Pattern pattern = Pattern.compile("@upper\\{(.*?)\\}");
Matcher matcher = pattern.matcher(string);
StringBuffer result = new StringBuffer();
while (matcher.find()) {
String key = matcher.group(1);
if (key != null) {
matcher.appendReplacement(result, key.toUpperCase());
}
}
matcher.appendTail(result);
System.out.println(result.toString());
} // END: main()
} // END: class
首先,我想忽略大括号的转义(\{
,\}
)。因此,在正确的顺序中总是有相同数量的打开和关闭大括号
这是一个可以解决这个问题的简明正则表达式吗?使用正则表达式有什么原因吗?只需使用for循环遍历字符串,这将更容易解决。您的表达式与标记等效,不应使用正则表达式来解释它-为此使用您自己的解析器。快速回答:不。匹配嵌套大括号使您的“语言”成为递归语法,而不是正则语言,这意味着它不能被正则表达式匹配。高级正则表达式可能可以做到这一点,但它不会简洁或简单。您可以查看解析,如果您知道最大嵌套深度,添加捕获内容的步骤应该不会太难。如果筑巢是可行的。注意,您必须在Java()的字符类之外转义
{}
。