回答:
必要な正規表現は/(.)\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文字の10以上に一致します。
上記のテストスクリプトはPerlで記述されていますが、これは非常に標準的な正規表現構文であり、どの言語でも機能するはずです。いくつかのバリアントでは、バックスラッシュをもっと使用する必要があるかもしれません\(.\)\1\{9,\}
。例えば、Emacsはここに書くようにします。
文字列全体が9文字以上の同じ文字で構成される場合は、パターンの周りにアンカーを追加します。
my $regex = qr/^(.)\1{9,}$/;
Pythonでは、使用できます (.)\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
.
任意の文字に一致します。すでに述べた中括弧と組み合わせて使用されます:
$: cat > test
========
============================
oo
ooooooooooooooooooooooo
$: grep -E '(.)\1{10}' test
============================
ooooooooooooooooooooooo
grep -E '([=o])\1{10}' test
、grep -E '([=o]){10}' test
あなたの例でうまく機能します(\1
2番目のコマンドには欠けていることに注意してください)しかし、コマンド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==='
。説明していただけますか?乾杯;)
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つの連続した繰り返し文字を消去し、次のように出力します。
彼女をモハーブする
={10,}
=
10回以上繰り返されるマッチ。