我需要使用正则表达式来匹配大括号,例如每个打开的大括号
abc{abc{bc}xyz}
我需要它从{abc{bc}xyz}
得到{abc{bc}
来获取所有内容。
我尝试使用(\{.*?})
答案 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 量词。也就是说,它将匹配可能的最少字符数。如果您将表达式更改为{.*}
,您会发现它会起作用。
如果您要做的是验证大括号是否正确匹配,那么正如其他答案所述,使用(单个)正则表达式是不可能的。您可以通过使用堆栈扫描字符串来完成此操作。或者使用一些伏都教来迭代前一个最大匹配的正则表达式。让人惊讶。