我正在寻找一个简单的正则表达式,以匹配相同的字符重复10次左右。例如,如果我有一个满是水平线的文档:
=================================================
它将与 =字符行匹配,因为它重复了10次以上。我想这为 任何字符的工作。
=
={10,}
匹配重复10次或更多次的 =。
使用{10,}运算符:
$: cat > testre ============================ == ============== $: grep -E '={10,}' testre ============================ ==============
您需要的正则表达式是 /(.)\1{9,}/。
/(.)\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个或更多相同字符。因此,这匹配任何一个字符的十个或更多。
\1
(.)
.
{9,}
虽然上面的测试脚本是在佩尔,但这是非常标准的 regex 语法,应该可以在任何语言中使用。在某些变体中,您可能需要使用更多的反斜杠,例如 Emacs 会让您在这里编写 \(.\)\1\{9,\}。
\(.\)\1\{9,\}
如果一个完整的字符串应该由9个或更多相同的字符组成,在模式周围添加锚:
my $regex = qr/^(.)\1{9,}$/;
.匹配任何字符。与前面提到的花括号连用:
$: cat > test ======== ============================ oo ooooooooooooooooooooooo $: grep -E '(.)\1{10}' test ============================ ooooooooooooooooooooooo
在 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
您也可以使用 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示例:
preg_replace
$str = "motttherbb fffaaattther"; $str = preg_replace("/([a-z])\\1/", "", $str); echo $str;
在这里,[a-z]命中字符,然后 ()允许它与 \\1反向引用一起使用,后者尝试匹配另一个相同的字符(注意,这里的目标已经是连续的2个字符) ,因此:
[a-z]
()
\\1
妈妈,爸爸
如果你这样做了:
$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