我需要一个仅在搜索字符串位于特定位置时才匹配的正则表达式。这些位置是4的倍数。
这里是一个例子:
输入:ABCDEABCD123ABCDEFGH
我想匹配ABCD
,但前提是ABCD
位于0、4、8、12等位置。
我尝试了简单模式ABCD
,该模式匹配如下: ABCD E ABCD 123 ABCD EFGH。
那不是我想要的,不应找到第二个匹配项。
作为附加要求:第一个匹配项必须在字符串的开头。因此,以下示例不应匹配:“ 1234EABCD123ABCDEFGH”。
我该如何实现?
答案 0 :(得分:3)
如果您使用的是正则表达式引擎,因为您使用的是支持\G
anchor的.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 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 }