【问题标题】:Regular expression to match any character being repeated more than 10 times正则表达式匹配任何重复超过 10 次的字符
【发布时间】:2010-12-12 06:05:47
【问题描述】:

我正在寻找一个简单的正则表达式来匹配重复超过 10 次的相同字符。因此,例如,如果我有一个散布着水平线的文档:

=================================================

它将匹配= 字符的行,因为它重复了10 次以上。 注意,我希望它适用于任何角色。

【问题讨论】:

  • 这个答案的标题有误导性,你应该说'正则表达式匹配任何重复超过 10 次的字符'

标签: regex


【解决方案1】:

一个稍微通用的 powershell 示例。在 powershell 7 中,匹配突出显示,包括最后一个空格(你能在堆栈中突出显示吗?)。

'a b c d e f ' | select-string '([a-f] ){6,}'

a b c d e f 

【讨论】:

    【解决方案2】:

    PHP 的preg_replace 示例:

    $str = "motttherbb fffaaattther";
    $str = preg_replace("/([a-z])\\1/", "", $str);
    echo $str;
    

    这里[a-z] 命中字符,() 然后允许它与尝试匹配另一个相同字符的\\1 反向引用一起使用(注意这已经针对 2 个连续字符),因此:

    爸爸妈妈

    如果你这样做了:

    $str = preg_replace("/([a-z])\\1{2}/", "", $str);
    

    这将删除 3 个连续重复的字符,输出:

    莫赫布她

    【讨论】:

      【解决方案3】:

      您需要的正则表达式是/(.)\1{9,}/

      测试:

      #!perl
      use warnings;
      use strict;
      my $regex = qr/(.)\1{9,}/;
      print "NO" if "abcdefghijklmno" =~ $regex;
      print "YES" if "------------------------" =~ $regex;
      print "YES" if "========================" =~ $regex;
      

      这里\1 被称为反向引用。它引用方括号(.) 之间的点. 捕获的内容,然后{9,} 要求九个或更多相同的字符。因此这匹配十个或更多任何单个字符。

      虽然上面的测试脚本是用 Perl 编写的,但这是非常标准的正则表达式语法,应该适用于任何语言。在某些变体中,您可能需要使用更多的反斜杠,例如Emacs 会让你在这里写\(.\)\1\{9,\}

      如果整个字符串应包含 9 个或更多相同的字符,请在模式周围添加锚点:

      my $regex = qr/^(.)\1{9,}$/;
      

      【讨论】:

        【解决方案4】:

        在某些应用程序上,您需要删除斜线才能使其正常工作。

        /(.)\1{9,}/
        

        或者这个:

        (.)\1{9,}
        

        【讨论】:

          【解决方案5】:

          您还可以使用PowerShell to quickly replace words 或字符重复。 PowerShell 适用于 Windows。当前版本是 3.0。

          $oldfile = "$env:windir\WindowsUpdate.log"
          
          $newfile = "$env:temp\newfile.txt"
          $text = (Get-Content -Path $oldfile -ReadCount 0) -join "`n"
          
          $text -replace '/(.)\1{9,}/', ' ' | Set-Content -Path $newfile
          

          【讨论】:

            【解决方案6】:

            在 Python 中,您可以使用 (.)\1{9,}

            • (.) 从一个字符(任何字符)组成组
            • \1{9,} 匹配第一组中的九个或更多字符

            示例:

            txt = """1. aaaaaaaaaaaaaaa
            2. bb
            3. cccccccccccccccccccc
            4. dd
            5. eeeeeeeeeeee"""
            rx = re.compile(r'(.)\1{9,}')
            lines = txt.split('\n')
            for line in lines:
                rxx = rx.search(line)
                if rxx:
                    print line
            

            输出:

            1. aaaaaaaaaaaaaaa
            3. cccccccccccccccccccc
            5. eeeeeeeeeeee
            

            【讨论】:

            • if re.search(line): 打印行(不需要赋值给 rxx 变量)
            • 在这个简单的上下文中你是对的。使用变量 rxx,我可以执行 rxx.group(1)、rxx.start(1) 等操作。
            【解决方案7】:

            . 匹配任何字符。与已经提到的花括号一起使用:

            $: cat > test
            ========
            ============================
            oo
            ooooooooooooooooooooooo
            
            
            $: grep -E '(.)\1{10}' test
            ============================
            ooooooooooooooooooooooo
            

            【讨论】:

            • 嗨 Jeek 和@SilentGhost。 grep -E '([=o])\1{10}' testgrep -E '([=o]){10}' test 这两个命令在您的示例中运行良好(注意第二个命令中缺少 \1)。但是命令grep -E '([=o])\1{10}' <<< '==o==o==o==o==o==o===o==o===' 与该行不匹配!但是,没有\1 的命令与以下行匹配:grep -E '([=o]){10}' <<< '==o==o==o==o==o==o===o==o==='。请问你能解释一下吗?干杯 ;)
            【解决方案8】:

            使用 {10,} 运算符:

            $: cat > testre
            ============================
            ==
            ==============
            
            $: grep -E '={10,}' testre
            ============================
            ==============
            

            【讨论】:

              【解决方案9】:
              ={10,}
              

              匹配重复 10 次或更多次的 =

              【讨论】:

              • 确定不包含 10 个或更多任意字符?
              • perl -e 'print "NO" if "abcdefghijklmno" =~ /.{10,}/;'
              • 这是错误的,但它已被编辑(以匹配我的答案,得到了一些反对,好)
              • 哎呀,不知道我必须明确地说你可以用你想要的任何东西替换字符。
              猜你喜欢
              • 2016-01-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-23
              • 1970-01-01
              • 2012-08-22
              相关资源
              最近更新 更多