正则表达式匹配一个数字中的 7 个相同数字,无论位置如何
Posted
技术标签:
【中文标题】正则表达式匹配一个数字中的 7 个相同数字,无论位置如何【英文标题】:Regex to match 7 same digits in a number regardless of position 【发布时间】:2021-10-08 06:26:59 【问题描述】:我想匹配一个 8 位数字。目前,我有以下正则表达式,但在某些情况下它会失败。
(\d+)\16
仅当结尾的数字不同时才匹配,例如 44444445 或 54444444。但是,我希望匹配至少 7 位数字相同的情况,而不管它们的位置如何。 在这样的情况下它会失败
44454444
44544444
44444544
这里需要修改什么?
【问题讨论】:
你为什么要通过正则表达式来做到这一点。性能会很糟糕,因为它需要回溯很多 【参考方案1】:在性能敏感的位置使用它可能是个坏主意,但您可以使用捕获引用来实现这一点。
你需要的正则表达式如下:
(\d)(?:.*?\1)6
分解:
(\d)
任意一位数的捕获组
.*?
表示懒惰地匹配任意字符零次或多次
\1
表示匹配第一个捕获组
我们将其封装在一个非捕获组中?:
并添加量词6
匹配六次
【讨论】:
【参考方案2】:您可以在匹配之前对数字进行排序
string input = "44444445 54444444 44454444 44544444 44444544";
string[] numbers = input.Split(' ');
foreach (var number in numbers)
number = String.Concat(str.OrderBy(c => c));
if (Regex.IsMatch(number, @"(\d+)\16"))
// do something
尽管如此使用正则表达式仍然不是一个好主意
【讨论】:
【参考方案3】:您尝试的模式(\d+)\16
连续匹配 6 个相同的数字。如果您想将匹配扩展到多个相同的数字,则必须匹配其间的可选数字。
请注意,在 .NET 中,\d
与 more digits 匹配的不仅仅是 0-9。
如果您想使用 C# 仅匹配数字 0-9,而不匹配数字之间的其他字符:
([0-9])(?:[0-9]*?\1)6
模式匹配:
([0-9])
捕获第 1 组
(?:
非捕获组
[0-9]*?\1
匹配可选数字 0-9 和对组 1 的反向引用
)6
关闭非捕获组并重复6次
查看.NET Regex demo
如果您只想匹配 8 位数字,可以使用正向前瞻 (?=
来断言 8 位数字和字边界 \b
\b(?=\d8\b)[0-9]*([0-9])(?:[0-9]*?\1)6\d*\b
查看另一个.NET Regex demo
【讨论】:
以上是关于正则表达式匹配一个数字中的 7 个相同数字,无论位置如何的主要内容,如果未能解决你的问题,请参考以下文章