有没有一种正则表达式风格可以让我计算 * 和 + 运算符匹配的重复次数?

5

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

3个回答

10

你很幸运,因为事实上.NET正则表达式可以做到这一点(我认为这相当独特)。在每次匹配中,每个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);
}

这会打印出 (如同在ideone.com上看到的):

hahahaha 4
huahuahua 3
huahahahuaha 5

API参考


请参阅 https://dev59.com/00vSa4cB1Zd3GeqPie4o 和 https://dev59.com/GHA75IYBdhLWcg3wYYFQ。 - polygenelubricants

3
您可以在表达式中使用括号创建一个组,然后在该组上使用+*运算符。您可以使用Captures属性来确定它匹配了多少次。GroupCaptures属性可用于确定其匹配了多少次。以下示例计算字符串开头连续小写字母的数量:
var regex = new Regex(@"^([a-z])+");
var match = regex.Match("abc def");

if (match.Success)
{
    Console.WriteLine(match.Groups[1].Captures.Count);
}

+1;我还添加了一个例子,其中答案与匹配字符串长度不同。 - polygenelubricants

0

试试使用 "pref ([a-z]+) suff"

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

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


不适用于一般模式的重复(请参见我的答案示例),但是如果模式正好匹配一个字符,这将起作用。 - polygenelubricants

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接