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


107

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

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

=因为它将重复十次以上,所以它将与字符行匹配。请注意,我希望此功能适用于任何角色。


2
此附加服务的标题具有误导性,您应该说“正则表达式可以匹配重复超过10次的任何字符”
dalloliogm

Answers:


157

您需要的正则表达式是/(.)\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个或更多相同字符。因此,这匹配任何单个字符的十个或更多。

尽管上面的测试脚本使用Perl,但是这是非常标准的regex语法,并且可以使用任何语言。在某些变体中,您可能需要使用更多的反斜杠,例如Emacs将使您\(.\)\1\{9,\}在此处编写。

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

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

28

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

  • (。)从一个字符(任何字符)组成组
  • \ 1 {9,}匹配第一组中的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):打印行(不必为rxx变量赋值)
dalloliogm,2009年

1
您在这个简单的上下文中是正确的。采用可变RXx中我可以这样做rxx.group(1),rxx.start(1)等
米哈尔尼克拉斯

5

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

$: 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==='。请您能解释一下吗?干杯;)
olibre

3

在某些应用上,您需要删除斜杠以使其正常运行。

/(.)\1{9,}/

或这个:

(.)\1{9,}

1

使用{10,}运算符:

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

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

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

1

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

她的


0
={10,}

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


1
确保这不包含10个或更多任意字符?
Etan

perl -e 'print "NO" if "abcdefghijklmno" =~ /.{10,}/;'

这是错误的,但是已经过编辑(以匹配我的回答,它得到了一些
赞成票

2
e,不知道我必须明确地说出您可以用任何想要的字符替换角色。
SilentGhost

0

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

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

a b c d e f 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.