正则表达式匹配嵌套大括号

时间:2010-05-06 04:53:10

标签: regex

我需要使用正则表达式来匹配大括号,例如每个打开的大括号 abc{abc{bc}xyz}我需要它从{abc{bc}xyz}得到{abc{bc}来获取所有内容。

我尝试使用(\{.*?})

6 个答案:

答案 0 :(得分:3)

正则表达式无法做到这一点。为此,必须使用无上下文语法,而正则表达式仅适用于有限的常规语言。

根据this link,.NET中的正则表达式可以使用扩展,但这只是意味着.NET正则表达式不仅仅是正则表达式。

答案 1 :(得分:2)

这不是正则表达式的任务。您正在寻找的是解析器。这意味着语言语法,LL(1),LALR,递归下降,龙书,通常是偏头痛。

答案 2 :(得分:2)

任意嵌套深度的平衡括号不是常规语言。这是一种无语境的语言。

尽管如此,许多“正则表达式”实现实际上认识的不仅仅是常规语言,所以这可以通过一些实现而不是其他实现。

维基百科

答案 3 :(得分:1)

正如Bryan所说,正则表达式可能不是正确的工具,但是如果你使用PHP,the manual给出了一个如何以递归/嵌套方式使用正则表达式的示例:

$input = "plain [indent] deep [indent] deeper [/indent] deep [/indent] plain";

function parseTagsRecursive($input)
{

    $regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';

    if (is_array($input)) {
        $input = '<div style="margin-left: 10px">'.$input[1].'</div>';
    }

    return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}

$output = parseTagsRecursive($input);

echo $output;

我不确定这对你是否有帮助。

答案 4 :(得分:0)

这在“标准”正则表达式语言中是不可能的。但是,一些不同的实现具有允许您实现它的扩展。例如,here's a blog post that explains how to do it with .NET's regex library

一般来说,这是正则表达式并不适合的任务。

答案 5 :(得分:0)

假设您要做的是选择{}之间的最大子字符串:

.*? lazy 量词。也就是说,它将匹配可能的最少字符数。如果您将表达式更改为{.*},您会发现它会起作用。

如果您要做的是验证大括号是否正确匹配,那么正如其他答案所述,使用(单个)正则表达式是不可能的。您可以通过使用堆栈扫描字符串来完成此操作。或者使用一些伏都教来迭代前一个最大匹配的正则表达式。让人惊讶。