使用.net正则表达式平衡匹配捕获内部项目

2024-03-21

我找到了有关 .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(使用前将#替换为@)

使用.net正则表达式平衡匹配捕获内部项目 的相关文章

随机推荐