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

Regex 正则表达式匹配最外层的模式,regex,Regex,我想知道与{}中的所有内容匹配的正则表达式。字符串可能包含嵌套的{};我不在乎他们 示例字符串:{不要}相信我。我是一个{非常非常{邪恶}的好人 我希望结果是不,非常非常非常{邪恶} 目前我仅有的正则表达式是/{\w+}/它只捕获邪恶。如果没有撇号,它也会返回not。因为有嵌套的大括号,所以提取大括号之间的部分的正则表达式不像:-\{.+?\}那样直。这个正则表达式将在它找到的第一个}处停止。因此,对于嵌套的大括号,它的行为将不好。为此,您需要一个稍微复杂一点的正则表达式。然而,我建议不要使用正

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

示例字符串:{不要}相信我。我是一个{非常非常{邪恶}的好人

我希望结果是不,非常非常非常{邪恶}


目前我仅有的正则表达式是/{\w+}/它只捕获邪恶。如果没有撇号,它也会返回not。

因为有嵌套的大括号,所以提取大括号之间的部分的正则表达式不像:-\{.+?\}那样直。这个正则表达式将在它找到的第一个}处停止。因此,对于嵌套的大括号,它的行为将不好。为此,您需要一个稍微复杂一点的正则表达式。然而,我建议不要使用正则表达式来解决此类问题。正则表达式不够好,不能考虑匹配括号对。它们只能解析常规语言。对于更高级别的内容,您应该编写自己的解析器

也就是说,您可以尝试以下正则表达式:-

"/\{((?:[^{}]*\{[^{}]*\})*[^{}]*?)\}/"
第一组。这将考虑嵌套的括号,只要它们是平衡的。你没有把大括号作为实际字符串的一部分

除了上述解决方案之外,您还可以看看这个示例解析器,它适用于您的特定情况。事实上,这适用于任何形式的嵌套大括号,前提是您有平衡大括号:-

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);

因为您有嵌套的大括号,所以提取大括号之间的部分的正则表达式不像:-\{.+?\}那样直接。这个正则表达式将在它找到的第一个}处停止。因此,对于嵌套的大括号,它的行为将不好。为此,您需要一个稍微复杂一点的正则表达式。然而,我建议不要使用正则表达式来解决此类问题。正则表达式不够好,不能考虑匹配括号对。它们只能解析常规语言。对于更高级别的内容,您应该编写自己的解析器

也就是说,您可以尝试以下正则表达式:-

"/\{((?:[^{}]*\{[^{}]*\})*[^{}]*?)\}/"
第一组。这将考虑嵌套的括号,只要它们是平衡的。你没有把大括号作为实际字符串的一部分

除了上述解决方案之外,您还可以看看这个示例解析器,它适用于您的特定情况。事实上,这适用于任何形式的嵌套大括号,前提是您有平衡大括号:-

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);
@这是正确的

如果您使用js或java,并且不知道嵌套括号的深度,那么您必须编写自己的解析器

但如果您使用C或perl,您可以使用平衡组来实现这一点,这是一个高级正则表达式功能,js不支持

这是正确的

如果您使用js或java,并且不知道嵌套括号的深度,那么您必须编写自己的解析器


但如果您使用C或perl,您可以使用平衡组来实现这一点,这是一个高级正则表达式功能,js不支持

+1真的,我的朋友!我删除了我的答案,因为你的答案更准确。我的会在嵌套大括号中失败。+1真的,我的朋友!我删除了我的答案,因为你的答案更准确。我的将在嵌套大括号处失败。您使用的是哪个正则表达式引擎?有些支持递归,但大多数不支持。您使用的是哪个正则表达式引擎?有些支持递归,但大多数不支持。