正则表达式匹配重复出现超过10次的任何字符

165

我正在寻找一个简单的正则表达式,以匹配重复多达10次或更多次的相同字符。例如,如果我有一个布满水平线的文档:

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

它将匹配包含等于号=字符的行,因为它重复了10次以上。注意:我希望这对任何字符都适用。


4
这个答案的标题有误导性,你应该说“正则表达式匹配重复超过10次的任何字符”。 - dalloliogm
8个回答

232
你需要的正则表达式是/(.)\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,\}

如果整个字符串应由10个或更多个相同字符组成,请在模式周围添加锚点:

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

46

在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

如果 re.search(line):print line(rxx 变量的赋值不是必要的) - dalloliogm
2
在这个简单的情境下,你是正确的。使用变量rxx,我可以做类似rxx.group(1),rxx.start(1)等操作。 - Michał Niklas

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 ==='。请解释一下?干杯;) - oHo

3
={10,}

匹配 = 被重复10次或更多次的内容。


1
请确保这不会超过10个或更多的任意字符。 - Etan
perl -e 'print "NO" if "abcdefghijklmno" =~ /.{10,}/;' - user181548
它原本是错误的,但已经被编辑过了(以匹配我的回答,因为它得到了一些踩)。 - dalloliogm
4
哎呀,我没想到我需要明确说明你可以用任何你想要的东西来替换这个字符。 - SilentGhost

2

使用 {10,} 运算符:

$: cat > testre
============================
==
==============

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

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

这里的 [a-z] 匹配字符,() 允许其与 \\1 回溯一起使用(注意这已经针对两个连续字符进行了匹配),因此:

母亲 父亲

如果你这样做:

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

需要删除3个连续重复的字符,输出结果为:

moherbb her


1

你还可以使用PowerShell 快速替换单词或字符重复。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

0
一个稍微通用一些的PowerShell示例。在PowerShell 7中,匹配项包括最后一个空格都会被高亮显示(你能在Stack中进行高亮显示吗?)。
'a b c d e f ' | select-string '([a-f] ){6,}'

a b c d e f 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接