10回以上繰り返される任意の文字に一致する正規表現


106

同じ文字が10回以上繰り返される単純な正規表現を探しています。したがって、たとえば、ドキュメントに横線が散らばっている場合:

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

=10回以上繰り返されるため、文字の行と一致します。これがどのキャラクターで機能するようにしたいことに注意しください


2
この回答のタイトルは誤解を招く可能性があります。「10回以上繰り返される任意の文字に一致する正規表現」と言うべき
でした

回答:


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以上を要求します。したがって、これは任意の1文字の10以上に一致します。

上記のテストスクリプトはPerlで記述されていますが、これは非常に標準的な正規表現構文であり、どの言語でも機能するはずです。いくつかのバリアントでは、バックスラッシュをもっと使用する必要があるかもしれません\(.\)\1\{9,\}。例えば、Emacsはここに書くようにします。

文字列全体が9文字以上の同じ文字で構成される場合は、パターンの周りにアンカーを追加します。

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

28

Pythonでは、使用できます (.)\1{9,}

  • (。)1つの文字(任意の文字)からグループを作成します
  • \ 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

if re.search(line):行を出力します(rxx変数への割り当ては必要ありません)
dalloliogm 2009年

1
あなたはこの単純な文脈で正しいです。変数は、私がrxx.group(1)のような何かを行うことができますRXX使用して、rxx.start(1)など
のMichałニクラス

5

.任意の文字に一致します。すでに述べた中括弧と組み合わせて使用​​されます:

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


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

こんにちはJeekと@SilentGhostです。2つのコマンドはgrep -E '([=o])\1{10}' testgrep -E '([=o]){10}' testあなたの例でうまく機能します(\12番目のコマンドには欠けていることに注意してください)しかし、コマンド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 2013年

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,}/;'

それは間違っていましたが、編集されました(いくつかの反対票を得た私の回答と一致するように、良いです)
dalloliogm 2009年

2
ジー、私はあなたがキャラクターをあなたが望むもので置き換えることができることを明示的に言わなければならないことを知りませんでした。
SilentGhost 2009年

0

もう少し一般的なpowershellの例。powershell 7では、最後のスペースを含めて一致が強調表示されます(スタックで強調表示できますか?)。

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

a b c d e f 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.