Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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_String_Pattern Matching_Backreference - Fatal编程技术网

如何在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()的字符类之外转义
{}