滑动正则表达式语法C#

时间:2013-06-28 11:54:26

标签: c# regex

鉴于此输入:123456789 我需要一个使用以下MatchCollection生成match.Value的正则表达式: 123; 234; 345; 456; 567; 678; 789

到目前为止,我试图使用“反向引用”,贪婪,分组等,但没有运气。显然我太傻了,不能自己找到解决方案。

3 个答案:

答案 0 :(得分:5)

嗯,您可以使用positive lookahead assertionscapturing group

一起执行此操作
Regex regexObj = new Regex(@"(?=(\d{3}))");

您需要查看每个匹配的.Groups[1].Value

答案 1 :(得分:4)

匹配不能重叠。但你可以用Group代替那些:

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

这里的诀窍是lookaheadcapturing group的组合。请注意,尾随.并不是必需的,因为引擎无论如何都会将起始位置提前至少一个字符,但我认为它会使意图更清晰一些。另请注意,如果您的输入包含换行符,则您要省略尾随.,改为使用[\s\S]或使用RegexOptions.Singleline

或者,您可以使用Match() overload that takes an offset

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));
}

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

答案 2 :(得分:1)

不需要正则表达式:

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);
}