正则表达式匹配一个数字中的 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 个相同数字,无论位置如何的主要内容,如果未能解决你的问题,请参考以下文章

php正则 匹配 手机、座机号码

Linux Shell正则表达式如何匹配1~3位数字

正则表达式

C#正则表达式匹配方括号

正则表达式匹配时间格式的 1 位数字并替换为 2 位数字

正则匹配常用记录