首页 > 解决方案 > 具有固定块的正则表达式

问题描述

我需要一个仅当搜索字符串位于特定位置时才匹配的正则表达式。这些位置是 4 的倍数。

这是一个例子:

输入:ABCDEABCD123ABCDEFGH

我想匹配ABCD,但前提ABCD是位于位置 0、4、8、12 等等。

我尝试了简单的模式ABCD,匹配如下:ABCD E ABCD 123 ABCD EFGH。那不是我想要的,不应该找到第二个匹配项。

作为附加要求:第一个匹配项必须在字符串的开头。所以下面的例子不应该匹配:“1234EABCD123ABCDEFGH”。

我怎样才能做到这一点?

标签: .netregex

解决方案


如果您的正则表达式引擎由于您使用的是支持\Ganchor的 .NET,您可以使用以下内容:

(?:^|\G)(?:.{4})*?(ABCD)

在线尝试

这是一个 C# 示例:

string s = "ABCDEABCD123ABCDEFGH";
string pattern = @"(?:^|\G)(?:.{4})*?(ABCD)";
foreach (Match m in Regex.Matches(s, pattern))
{
    Console.WriteLine(m.Groups[1].Value + " at " + m.Groups[1].Index.ToString());
}

输出:

ABCD at 0
ABCD at 12

注意:正如@Wiktor在评论中指出的那样(?:^|\G)仅当您想要支持多行时才需要,例如 regex101 示例中显示的内容(而不是将它们视为单行)。在这种情况下,您需要RegexOptions.Multiline作为第三个参数传递给该Regex.Matches()方法。


推荐阅读