滑动正则表达式语法C#

本文关键字:语法 正则表达式 | 更新日期: 2023-09-27 18:20:19

给定此输入:123456789我需要一个正则表达式,它将生成具有以下match.ValueMatchCollection123; 234; 345; 456; 567; 678; 789

到目前为止,我尝试过使用"backreference"、贪婪、分组等,但没有成功。显然,我太笨了,自己找不到解决办法。

滑动正则表达式语法C#

好吧,您可以将正向前瞻断言与捕获组结合使用:

Regex regexObj = new Regex(@"(?=('d{3}))");

您需要查看每场比赛的.Groups[1].Value

匹配项不能重叠。但你可以把它们放在Group中:

foreach (Match m in Regex.Matches("123456789", @"(?=(.{3}))."))
{
    Console.WriteLine(m.Groups[1].Value);
}

这里的技巧是将前瞻和捕获组相结合。请注意,后面的.并不是真正必要的,因为引擎无论如何都会将起始位置提前至少一个字符,但我认为这会使意图更加清晰。另外请注意,如果您的输入包含换行符,您将希望省略后面的.,使用['s'S]或使用RegexOptions.Singleline

或者,您可以使用Match()过载,该过载会产生偏移:

Regex r = new Regex(@".{3}");
for (int i = 0; i < input.Length; i++)
{
    Match m = r.Match(input, i);
    if(m.Success)
        Console.WriteLine(m.Value);
}

但是,这既没有给你一个MatchCollection,也没有证明再使用正则表达式是合理的,因为你现在还可以使用Substring

for (int i = 0; i < input.Length - 2; i++)
{
    Console.WriteLine(input.Substring(i, 3));
}

当然,前两种方法很容易推广到更复杂的正则表达式(而第三种方法则不然):在第一种方法中,你可以用任意正则表达式替换前瞻性的内容;在第二种方法中你可以立即使用任意表达式。

不需要正则表达式:

string str = "123456789";
var threes = Enumerable.Range(0, str.Length - 2)
                       .Select(i => str.Substring(i, 3));
foreach (var item in threes)
{
    Console.WriteLine(item);
}