gpt4 book ai didi

.net - 使用 .net Regex Balanced Matching 捕获内部项目

转载 作者:行者123 更新时间:2023-12-04 22:38:18 24 4
gpt4 key购买 nike

我在 .net 正则表达式的平衡匹配上找到了以下资源:

  • http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx
  • http://blogs.msdn.com/bclteam/archive/2005/03/15/396452.aspx
  • http://msdn.microsoft.com/en-us/library/bs2twtah(VS.85).aspx#BalancingGroupDefinitionExample

  • 根据我在这些中读到的内容,以下示例应该有效:

    无论多深,此正则表达式都应在尖括号组内的任何位置找到“a”。它应该匹配“ <a>”、“ <<a>>”、“ <a<>>”、“ <<>a>”、“ <<><a>>”等。
    (?<=
    ^
    (
    (
    <(?<Depth>)
    |
    >(?<-Depth>)
    )
    [^<>]*?
    )+?
    )
    (?(Depth)a|(?!))

    匹配字符串“<<>a>”中的“a”

    虽然它适用于字符串“ <a<>>”和“ <<a>>”,但我无法让它匹配“a”后面的“>”。

    根据我读过的解释,前两个“<”应该增加深度两次,然后第一个“>”应该减少一次。在这一点上, (?(Depth)a|(?!)) 应该执行"is"选项,但正则表达式甚至从未在这里出现。

    考虑下面的正则表达式,它没有进行这样的检查并且仍然无法匹配有问题的字符串:
    (?<=
    ^
    (
    (
    <(?<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);
    }
    }

    结果:
    9, <0a2<4a6a>>
    11, a
    15, a
    17, a
    24, <56789a>
    30, a

    它没有处理条件,而是继续匹配整个括号分隔的(子)字符串,在此过程中捕获它可能包含的任何 a 。与您的方法不同,它可以从较大的字符串中提取任意数量的括号子字符串,并从每个子字符串中提取任意数量的 a

    关于.net - 使用 .net Regex Balanced Matching 捕获内部项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1363776/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com