.NET balanced group regexes让我头晕目眩。我有这个字符串我想要匹配:
other stuff blah blah....
{
stuff stuff
{key:
stuff
stuff
}
} more stuff.....
这是我的正则表达式:
[^{}]* # anything that isn't { }
\{ # starting with {
(?> # atomic group: throw away backtracks on exit
[^{}]+
|
\{(?:\w+:)?(?<DEPTH>) # on matching { plus optional "word:" push stack
|
\}(?<-DEPTH>) # on matching } pop stack
)*
(?(DEPTH)(?!)) # if depth unbalanced, fail match
\} # ending with }
[^{}]* # anything that isn't { }
所以,我正在尝试匹配平衡花括号,其中一些开口花括号有一个可选单词后跟一个冒号。上面的正则表达式匹配我的示例字符串,但如果我删除一个大括号,(即“不平衡它”):
other stuff blah blah....
{
stuff stuff
{key:
stuff
stuff
} more stuff.....
......它仍然匹配!
有谁能告诉我如何修复我的正则表达式?
答案 0 :(得分:4)
你在第二种情况下检查过匹配的内容吗?由于你没有任何锚点,我认为引擎在第一个'{'之后开始匹配。从那里开始,直到结束,字符串匹配。
尝试使用\ A和\ z包围模式。
答案 1 :(得分:-1)
不要成为一种杀戮的快乐,但是你试图用正则表达式做的事情令人难以置信,因为这根本不可能。正则表达式是一类有限自动机,并且没有足够的状态来执行递归/嵌套匹配。你需要一个无上下文的语法才能使这个工作。
有一些正则表达式引擎支持递归的概念。但这些并不是严格意义上的正则表达式。你能告诉我们你正在使用什么引擎,因为它可能有一个递归功能,这将有助于这种情况。