นิพจน์ทั่วไปเพื่อให้ตรงกับอักขระใด ๆ ที่ทำซ้ำมากกว่า 10 ครั้ง


112

ฉันกำลังมองหานิพจน์ทั่วไปที่เรียบง่ายเพื่อจับคู่อักขระเดียวกันที่ถูกทำซ้ำมากกว่า 10 ครั้งหรือมากกว่านั้น ตัวอย่างเช่นหากฉันมีเอกสารที่เกลื่อนไปด้วยเส้นแนวนอน:

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

มันจะตรงกับบรรทัดของ=ตัวอักษรเพราะซ้ำมากกว่า 10 ครั้ง โปรดทราบว่าฉันต้องการให้สิ่งนี้ใช้ได้กับตัวละครใด ๆ


2
ชื่อของผู้ช่วยนี้ทำให้เข้าใจผิดคุณควรจะพูดว่า 'นิพจน์ทั่วไปเพื่อจับคู่อักขระใด ๆ ที่ซ้ำมากกว่า 10 ครั้ง'
dalloliogm

คำตอบ:


164

regex /(.)\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เรียกว่า backreference มันอ้างอิงถึงสิ่งที่จับโดยจุด .ระหว่างวงเล็บ(.)และจากนั้น{9,}ขอให้เก้าตัวขึ้นไปของอักขระเดียวกัน ดังนั้นจึงจับคู่อักขระเดี่ยวสิบตัวขึ้นไป

แม้ว่าสคริปต์ทดสอบข้างต้นจะอยู่ใน Perl แต่นี่เป็นไวยากรณ์ regex มาตรฐานมากและควรทำงานในภาษาใดก็ได้ ในบางรูปแบบคุณอาจต้องใช้แบ็กสแลชมากกว่านี้เช่น Emacs จะทำให้คุณเขียน\(.\)\1\{9,\}ที่นี่

หากสตริงทั้งหมดควรประกอบด้วยอักขระที่เหมือนกัน 9 ตัวขึ้นไปให้เพิ่มจุดยึดรอบรูปแบบ:

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

29

ใน Python คุณสามารถใช้ (.)\1{9,}

  • (.) สร้างกลุ่มจากหนึ่งอักขระ (ถ่านใด ๆ )
  • \ 1 {9,} จับคู่อักขระตั้งแต่เก้าตัวขึ้นไปจากกลุ่มที่ 1

ตัวอย่าง:

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

ถ้า re.search (บรรทัด): พิมพ์บรรทัด (ไม่จำเป็นต้องกำหนดให้กับตัวแปร 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}' testและgrep -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


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

preg_replaceตัวอย่างของ PHP :

$str = "motttherbb fffaaattther";
$str = preg_replace("/([a-z])\\1/", "", $str);
echo $str;

ที่นี่[a-z]กระทบตัวละคร()จากนั้นอนุญาตให้ใช้กับ\\1backreference ซึ่งพยายามจับคู่อักขระเดียวกันอีกตัว (โปรดทราบว่านี่คือการกำหนดเป้าหมายอักขระ 2 ตัวติดต่อกันแล้ว) ดังนั้น:

พ่อแม่

ถ้าคุณทำ:

$str = preg_replace("/([a-z])\\1{2}/", "", $str);

ที่จะลบอักขระที่ซ้ำกัน 3 ตัวต่อเนื่องผลลัพธ์:

moherbb เธอ


0
={10,}

การแข่งขัน=ที่เกิดขึ้นซ้ำ 10 ครั้งขึ้นไป


1
แน่ใจว่าสิ่งนี้ไม่ใช้อักขระ 10 ตัวขึ้นไป?
Etan

perl -e 'print "NO" if "abcdefghijklmno" =~ /.{10,}/;'

มันผิด แต่ได้รับการแก้ไขแล้ว (เพื่อให้ตรงกับคำตอบของฉันซึ่งได้รับการ
โหวตลดลงบ้าง

2
ไม่ทราบว่าฉันต้องพูดอย่างชัดเจนว่าคุณสามารถแทนที่ตัวละครด้วยอะไรก็ได้ที่คุณต้องการ
SilentGhost

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.