【问题标题】:Regex match for Blocks of repeating digits重复数字块的正则表达式匹配
【发布时间】:2021-10-07 23:00:24
【问题描述】:

我正在尝试匹配重复数字块,例如 275275274545454549994949

我有 8 位数字。我想创建一个 regex,仅当模式中至少有 2 或 3 个数字重复时才会匹配。

11046758 不是有效匹配。但 11046755110466758 是有效匹配项。

目前,我有这个正则表达式

(\d)\1+

这个正则表达式的问题是它也匹配 11046758。但是,它应该只在至少有 2 个数字重复时才匹配。

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    您可以使用带有 2 个反向引用和一个单词边界的 2 个捕获组\b

    \b[0-9]*([0-9])[0-9]*\1[0-9]*([0-9])[0-9]*\2[0-9]*\b
    

    查看.NET regex demo

    如果应该有 8 位数字,您可以使用正向前瞻。但请注意,110466758 无效,因为它是 9 位数字。

    \b(?=[0-9]{8}\b)[0-9]*([0-9])[0-9]*\1[0-9]*([0-9])[0-9]*\2[0-9]*\b
    

    Regex demo


    如果您还想匹配12341234,另一种选择可能是先对字符串进行排序,然后找到 2 次 2 重复数字:

    string[] strings = {
        "11223344",
        "12341234",
        "27527527",
        "11046758"
        };
    string pattern = @"\b[0-9]*([0-9])\1[0-9]*([0-9])\2[0-9]*\b";
    foreach (String str in strings)
    {
        Match m = Regex.Match(String.Concat(str.OrderBy(c => c)), pattern);
        if (m.Success)
        {
            Console.WriteLine("Match {0}", str);
        }
        else
        {
            Console.WriteLine("No match for {0}", str);
        }
    }
    

    输出

    Match 11223344
    Match 12341234
    Match 27527527
    No match for 11046758
    

    C# demo

    【讨论】:

    • 但是这个正则表达式不匹配 27527527 或 45454545
    • @Waqarulislam 匹配45454545 你是这个意思吗? \b(?=[0-9]{8}\b)[0-9]*([0-9]+)[0-9]*\1[0-9]*([0-9]+)[0-9]*\2[0-9]*\bregex101.com/r/6keqhY/1
    • @Waqarulislam 我已经更新了答案以匹配 2 个重复的个位数,这也将匹配 cmets 中的数字。
    猜你喜欢
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2016-10-24
    • 1970-01-01
    相关资源
    最近更新 更多