带固定块的正则表达式

时间:2018-08-28 12:49:30

标签: .net regex

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

这里是一个例子:

输入:ABCDEABCD123ABCDEFGH

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

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

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

我该如何实现?

2 个答案:

答案 0 :(得分:3)

如果您使用的是正则表达式引擎,因为您使用的是支持\G anchor的.NET,因此可以使用以下方式:

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

Try it online

这是一个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 pointed out in the comments一样,(?:^|\G)仅在您想支持多行(如regex101示例中显示的内容)时才需要(将其视为一行)。在这种情况下,您需要将RegexOptions.Multiline作为第三个参数传递给Regex.Matches()方法。

答案 1 :(得分:0)

使用Regex作为模式操纵工具,而不是令牌解析器。 实现业务逻辑并采取结果以提供答案取决于以下过程。

var text      = "ABCDEABCD123ABCDEFGH"; 
var locations = new List<int> { 0, 4, 8, 12 };

Regex.Matches(text, "ABCD")
     .OfType<Match>()
     .Where (mt => locations.Contains(mt.Index))
     .Select (mt => mt.Index)
     .ToList();

//结果为{ 0, 12 }