1

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

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

我希望结果是Don'tand very very {evil}

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

4

2 回答 2

5

由于您有嵌套的大括号,因此提取大括号之间部分的正则表达式不像: - 那样直接\{.+?\}}这个正则表达式将在它找到的第一个位置停止。因此,对于嵌套大括号,它不会表现得很好。为此,您需要一个稍微复杂的正则表达式。但是,我建议不要将 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}]
于 2013-02-05T18:43:02.853 回答
0

@Rohit 是正确的。

如果您使用 js 或 java,并且没有嵌套括号的深度,则必须编写自己的解析器。

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

于 2013-02-06T06:53:22.950 回答