【问题标题】:Is there a regex flavor that allows me to count the number of repetitions matched by the * and + operators?是否有一种正则表达式可以让我计算 * 和 + 运算符匹配的重复次数?
【发布时间】:2011-03-03 00:42:36
【问题描述】:

是否有正则表达式可以让我计算*+ 运算符匹配的重复次数?我特别想知道.NET平台下是否可以。

【问题讨论】:

    标签: .net regex matching repeat capturing-group


    【解决方案1】:

    你很幸运,因为事实上 .NET 正则表达式就是这样做的(我认为这是非常独特的)。基本上在每个Match 中,每个Group 存储每个已生成的Captures

    因此,您可以通过以下方式计算可重复模式与输入匹配的次数:

    • 使其成为捕获组
    • 计算该组在每场比赛中的捕获次数
      • 如果需要,您也可以遍历单个捕获!

    这是一个例子:

    Regex r = new Regex(@"\b(hu?a)+\b");
    
    var text = "hahahaha that's funny but not huahuahua more like huahahahuaha";
    foreach (Match m in r.Matches(text)) {
       Console.WriteLine(m + " " + m.Groups[1].Captures.Count);
    }
    

    这会打印 (as seen on ideone.com):

    hahahaha 4
    huahuahua 3
    huahahahuaha 5
    

    API 参考

    【解决方案2】:

    您可以在表达式中使用括号来创建一个组,然后对该组使用+* 运算符。 GroupCaptures 属性可用于确定匹配的次数。以下示例计算字符串开头的连续小写字母数:

    var regex = new Regex(@"^([a-z])+");
    var match = regex.Match("abc def");
    
    if (match.Success)
    {
        Console.WriteLine(match.Groups[1].Captures.Count);
    }
    

    【讨论】:

    • +1;我还添加了一个示例,其中答案与匹配字符串长度不同。
    【解决方案3】:

    要不要拿"pref ([a-z]+) suff"

    然后使用组来捕获括号中的 [a-z]+ 并找到它的长度?

    您也可以将此长度用于后续匹配。

    【讨论】:

    • 不适用于一般模式的重复(例如,请参阅我的回答),但显然如果模式与一个字符完全匹配,这将起作用
    猜你喜欢
    • 1970-01-01
    • 2014-05-06
    • 2017-09-26
    • 2014-11-06
    • 2010-10-02
    • 2013-11-18
    相关资源
    最近更新 更多