我找到了有关 .net 正则表达式平衡匹配的以下资源:
- http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx
- http://blogs.msdn.com/bclteam/archive/2005/03/15/396452.aspx http://blogs.msdn.com/bclteam/archive/2005/03/15/396452.aspx
- http://msdn.microsoft.com/en-us/library/bs2twtah(VS.85).aspx#BalancingGroupDefinitionExample http://msdn.microsoft.com/en-us/library/bs2twtah(VS.85).aspx#BalancingGroupDefinitionExample
根据我在其中读到的内容,以下示例应该有效:
此正则表达式应该在尖括号组内的任何位置找到“a”,无论有多深。它应该匹配“<a>
", "<<a>>
", "<a<>>
", "<<>a>
", "<<><a>>
", etc.
(?<=
^
(
(
<(?<Depth>)
|
>(?<-Depth>)
)
[^<>]*?
)+?
)
(?(Depth)a|(?!))
匹配字符串“a>”中的“a”
虽然它适用于字符串”<a<>>
" and "<<a>>
”,我无法让它匹配“>”后面的“a”。
根据我读过的解释,前两个“”应该将深度减少一次。此时, (?(Depth)a|(?!)) 应该执行“yes”选项,但正则表达式甚至从未在此处执行。
考虑以下正则表达式,它没有进行此类检查,但仍然无法匹配有问题的字符串:
(?<=
^
(
(
<(?<Depth>)
|
>(?<-Depth>)
)
[^<>]*?
)+?
)
a
我是否遗漏了什么,或者正则表达式引擎工作不正常?
如果你想找到每一个'a'
它位于一对平衡的尖括号内,我建议采用这种方法:
Regex r = new Regex(@"
<
(?>
[^<>a]+
|
(a)
|
<(?<N>)
|
>(?<-N>)
)+
(?(N)(?!))
>
", RegexOptions.IgnorePatternWhitespace);
string target = @"012a<56a8<0a2<4a6a>>012a<56789a>23456a";
foreach (Match m in r.Matches(target))
{
Console.WriteLine("{0}, {1}", m.Index, m.Value);
foreach (Capture c in m.Groups[1].Captures)
{
Console.WriteLine("{0}, {1}", c.Index, c.Value);
}
}
result:
9, <0a2<4a6a>>
11, a
15, a
17, a
24, <56789a>
30, a
它不会乱搞条件,而是继续匹配整个括号分隔(子)字符串,在此过程中捕获任何a
它可能包含。与您的方法不同,它可以从较大的字符串中提取任意数量的括号子字符串,并且可以提取任意数量的a
位于每个子串之外。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)