.net - 具有固定块的正则表达式
问题描述
我需要一个仅当搜索字符串位于特定位置时才匹配的正则表达式。这些位置是 4 的倍数。
这是一个例子:
输入:ABCDEABCD123ABCDEFGH
我想匹配ABCD
,但前提ABCD
是位于位置 0、4、8、12 等等。
我尝试了简单的模式ABCD
,匹配如下:ABCD E ABCD 123 ABCD EFGH。那不是我想要的,不应该找到第二个匹配项。
作为附加要求:第一个匹配项必须在字符串的开头。所以下面的例子不应该匹配:“1234EABCD123ABCDEFGH”。
我怎样才能做到这一点?
解决方案
如果您的正则表达式引擎由于您使用的是支持\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在评论中指出的那样,(?:^|\G)
仅当您想要支持多行时才需要,例如 regex101 示例中显示的内容(而不是将它们视为单行)。在这种情况下,您需要RegexOptions.Multiline
作为第三个参数传递给该Regex.Matches()
方法。
推荐阅读
- reactjs - I got undefined data while getting it from useSelector in react
- c++ - (为什么不)在定义时初始化 struct val
- c++ - 为什么没有声明从基模板类继承的成员函数?
- python - 拆分数据集后如何绘制带有色调的pairplot
- python - 当我在 DataFrame 中使用双括号时会发生什么?
- python - 使用 youtube.search().list 时获取相同的 youtube 频道 ID
- python - 有没有办法“关闭”或降级使用英特尔数学内核库(mkl)并使用“原始”(非 mkl)Numpy 函数?
- javascript - 如何使用 discord.js 跟踪谁邀请了机器人?
- reactjs - 我可以更改 MUI 中标签的位置吗?
- jenkins - 从一个 git 存储库拉到另一个 git 存储库时排除管道文件(例如 Jenkinsfile、bitbucket-pipelines.yml)