10 회 이상 반복되는 모든 문자와 일치하는 정규 표현식


107

10 회 이상 반복되는 동일한 문자와 일치하는 간단한 정규식을 찾고 있습니다. 예를 들어 가로줄이 흩어져있는 문서가있는 경우 :

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

=10 회 이상 반복되므로 문자 줄과 일치합니다 . 참고 내가위한 작업이 좋아하는 거라고 어떤 문자.


2
오해의 소지이 asnwer의 제목은, 당신은 '정규 표현식은 어떤 문자가 10 회 이상 반복에 맞게'말했다한다
dalloliogm

답변:


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,}구 이상의 같은 문자의 요청합니다. 따라서 이것은 10 개 이상의 단일 문자와 일치합니다.

위의 테스트 스크립트는 Perl에 있지만 이것은 매우 표준적인 정규식 구문이며 모든 언어에서 작동합니다. 일부 변형에서는 더 많은 백 슬래시를 사용해야 할 수 있습니다 \(.\)\1\{9,\}. 예를 들어 Emacs는 여기에 작성 합니다.

전체 문자열이 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

if re.search (line) : 줄 인쇄 (rxx 변수에 할당 할 필요가 없음)
dalloliogm

1
이 단순한 맥락에서 당신이 옳습니다. rxx 변수를 사용하면 rxx.group (1), rxx.start (1) 등과 같은 작업을 수행 할 수 있습니다.
Michał Niklas

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

그것은 잘못 있지만 (일부 downvotes, 좋은 가지고 내 대답에 맞게) 편집 된
dalloliogm을

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.