正则表达式匹配最外层的模式

时间:2013-02-05 18:33:29

标签: regex

我想知道匹配{}内所有内容的正则表达式。该字符串可能包含嵌套的{};我不在乎他们。

示例字符串:{Don't} trust me. I'm a {very very {evil}} good guy.

我希望结果为Don'tvery very {evil}

我目前唯一的正则表达式是/{\w+}/,它只捕获evil。如果它没有撇号,它也返回Dont

2 个答案:

答案 0 :(得分:4)

由于您使用嵌套大括号,因此在大括号之间提取部分的正则表达式不如:\{.+?\}。此正则表达式将在它找到的第一个}处停止。因此,对于嵌套大括号,它不会表现得很好。为此,您需要一个稍微复杂的正则表达式。但是,我建议不要将Regex用于此类问题。正则表达式不足以考虑匹配括号对。他们只能解析常规语言。对于任何高于此值的东西,你应该编写自己的解析器。

话虽这么说,你可以试试这个正则表达式: -

"/\{((?:[^{}]*\{[^{}]*\})*[^{}]*?)\}/"

获得group 1。这将考虑您的嵌套大括号,只要它们是平衡的。并且你没有将大括号作为实际字符串的一部分。


除了上述解决方案之外,您还可以查看此示例解析器,该解析器适用于您的特定情况。事实上,只要你有平衡的大括号,这应该适用于任何形式的嵌套大括号: -

String str = "{Don't} trust me. I'm a {very very {evil}} good guy.";

List<String> words = new ArrayList<>();
int openCount = 0;

StringBuilder builder = new StringBuilder();

for (int i = 0; i < str.length(); i++) {
    char ch = str.charAt(i);

    if (ch == '{') {
        if (openCount == 1) {
            builder.append(ch);
        }
        openCount += 1;

    } else if (ch == '}') {

        if (openCount > 1) {
            openCount--;
            builder.append(ch);

        } else {
            words.add(builder.toString());
            openCount--;
            builder = new StringBuilder();
        }

    } else {
        if (openCount >= 1) {
            builder.append(ch);
        }
    }
}

System.out.println(words);

输出: -

[Don't, very very {evil}]

答案 1 :(得分:0)

@Rohit是正确的。

如果使用js或java,而不是嵌套括号的深度,则必须编写自己的解析器。

但是如果你使用C#或perl,你可以使用“balance group”来实现这一点,这是一个高级正则表达式功能,js不支持。 :(