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

mum43rcc  于 2023-03-31  发布在  其他
关注(0)|答案(8)|浏览(135)

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

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

它将匹配=字符行,因为它重复了10次以上。注意我希望这对 * 任何 * 字符都有效。

kadbb459

kadbb4591#

您需要的正则表达式是/(.)\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,}请求9个或更多相同的字符。因此,这匹配了10个或更多的任何单个字符。
虽然上面的测试脚本是用Perl编写的,但这是非常标准的正则表达式语法,应该适用于任何语言。在某些变体中,你可能需要使用更多的反斜杠,例如Emacs会让你在这里写\(.\)\1\{9,\}
如果一个字符串应该包含10个或更多相同的字符,请在模式周围添加锚点:

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

e5nqia272#

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

  • (.)从一个char(任意char)创建一个group
  • \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
vof42yt1

vof42yt13#

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

$: cat > test
========
============================
oo
ooooooooooooooooooooooo

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

rslzwgfq4#

={10,}

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

nnsrf1az

nnsrf1az5#

使用{10,}运算符:

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

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

jecbmhm36#

您也可以使用PowerShell to quickly replace words或字符reptitions。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
v1l68za4

v1l68za47#

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个连续重复的字符,输出:
莫赫布海尔

64jmpszr

64jmpszr8#

一个更通用的powershell例子。在powershell7中,匹配项被高亮显示,包括最后一个空格(你能在堆栈中高亮显示吗?)

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

a b c d e f

相关问题