正则表达式,以匹配重复10次以上的任何字符

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

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

它将与 =字符行匹配,因为它重复了10次以上。我想这为 任何字符的工作。

195274 次浏览
={10,}

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

使用{10,}运算符:

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


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

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

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

如果一个完整的字符串应该由9个或更多相同的字符组成,在模式周围添加锚:

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

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

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




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

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

  • (.)从一个字符(任意字符)组成组
  • 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

您也可以使用 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

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

Moherbb 她

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

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


a b c d e f