我有以下代码:
void Main()
{
string template = @"
aaa
{begin iteration items}
bbbbbb
{begin iteration subitems}
ccccccc
{end iteration subitems}
ddddddddd
{begin iteration items}
hhhhhhhhhhhhhhhhh
{end iteration items}
iiiiiiiiiiiiiiiiiiiiiiiiiiii
{end iteration items}
eeeeeeeeeeeeeeee
{begin iteration items}
ffffff
{end iteration items}
gggggggggggg
";
string re = @"
\{\s*begin\s+iteration\s+items\s*}
(?<template>
(
(?<iteration>\{\s*begin\s+iteration\s+items\s*})
|(?<-iteration>\{\s*end\s+iteration\s+items\s*})
|((?!(\{\s*begin\s+iteration\s+items\s*})|(\{\s*end\s+iteration\s+items\s*})).*?)
)*(?(iteration)(?!))
)
\{\s*end\s+iteration\s+items\s*}
";
Regex r = new Regex(re, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
var matches = r.Matches(template);
matches.Dump();
}
当template
平衡时,则返回匹配项,一切正常。但是当我在模板中更改{end iteration items}
为{end1 iteration items}
后iiiiiiiiiiiiiii
行时,代码停止在线响应matches.Dump()
(Dump()
是在 LinQPad 中读取/枚举的扩展方法)
怎么了?是否可以重写正则表达式以使其始终响应?
编辑
我的目标是如果语法有效则捕获所有顶级<template>
组,否则不捕获任何内容。我按照卢卡斯的建议尝试了非回溯组,但是当语法有效时,现在没有捕获。