Saya pemula ekspresi reguler, dan saya tidak tahu cara menulis ekspresi reguler tunggal yang akan "cocok" dengan kata duplikat yang berurutan seperti:
Paris di dalam yang semi.
Bukan itu yang terkait.
Mengapa kamu tertawa? Apakah ekspresi reguler saya ITU buruk ??
Apakah ada satu ekspresi reguler yang akan cocok dengan SEMUA string tebal di atas?
regex
duplicates
capture-group
Joshua
sumber
sumber
not that that is related
->not that is related
)? Terima kasih sebelumnya\1
!\b(\w+)\s+(\1\s*)+\b
?Jawaban:
Coba ekspresi reguler ini:
Berikut
\b
adalah batas kata dan\1
referensi kecocokan yang ditangkap dari grup pertama.sumber
\0
juga? (Di mana\0
seluruh regex, hingga titik saat ini ATAU di mana\0
mengacu pada seluruh regex)Saya yakin regex ini menangani lebih banyak situasi:
Pilihan string pengujian yang baik dapat ditemukan di sini: http://callumacrae.github.com/regex-tuesday/challenge1.html
sumber
<strong>\0</strong>
tapi tidak berhasil.$1 <strong>$2</strong>
. Tetapi juga menggunakan regex yang berbeda/\b(\S+) (\1)\b/gi
. Ini tautannya: callumacrae.github.io/regex-tuesday/…<p class="bebe">bla bla</p>
bagaimana cara mengintegrasikan rumus regex ini?Coba ini dengan RE di bawah ini
() * Mengulangi lagi
sumber
Pustaka PCRE yang banyak digunakan dapat menangani situasi seperti itu (Anda tidak akan mencapai hal yang sama dengan mesin regex yang sesuai dengan POSIX):
sumber
\W+
.\b
tidak akan melakukannya, karena tidak mengonsumsi karakter apa pun.... the these problems...
. Solusi ini tidak dapat diandalkan seperti struktur umum pola Gumbo yang cukup mengimplementasikan batasan kata.<p class="bebe">bla bla</p>
bagaimana cara mengintegrasikan rumus regex ini?Ini adalah regex yang saya gunakan untuk menghapus frasa duplikat di bot kedutan saya:
(\S+\s*)
mencari string karakter apa pun yang bukan spasi, diikuti spasi.\1{2,}
lalu mencari lebih dari 2 contoh frasa itu dalam string untuk dicocokkan. Jika ada 3 frasa yang identik, itu cocok.sumber
\s*
dalam kelompok penangkapan. Lihat demonstrasi ini: regex101.com/r/JtCdd6/1I said "oioioi" that's some wicked mistressship!
padaoioioi
dansss
Ekspresi di bawah ini harus bekerja dengan benar untuk menemukan sejumlah kata yang berurutan. Pencocokan bisa peka huruf besar / kecil.
Contoh Masukan: Selamat tinggal selamat tinggal GooDbYe
Output Sampel: Selamat tinggal
Penjelasan:
Ekspresi regex:
\ b: Awal dari batas kata
\ w +: Sejumlah karakter kata
(\ s + \ 1 \ b) *: Sejumlah spasi diikuti kata yang cocok dengan kata sebelumnya dan mengakhiri batas kata. Seluruh hal yang dibungkus * membantu menemukan lebih dari satu pengulangan.
Pengelompokan:
m.group (0): Akan berisi grup yang cocok dalam kasus di atas. Selamat tinggal, selamat tinggal GooDbYe
m.group (1): Berisi kata pertama dari pola yang cocok dalam kasus di atas Selamat tinggal
Metode Replace akan mengganti semua kata yang cocok secara berurutan dengan contoh kata pertama.
sumber
Tidak. Itu adalah tata bahasa yang tidak teratur. Mungkin ada persamaan reguler khusus mesin / bahasa yang dapat Anda gunakan, tetapi tidak ada persamaan reguler universal yang dapat melakukannya.
sumber
Ini adalah salah satu yang menangkap banyak kata berkali-kali:
sumber
<p class="bebe">bla bla</p>
bagaimana cara mengintegrasikan rumus regex ini?<p class="bebe">.*?\b\s+(\w+)\b\K\s+\1\s+\b(?=.*?<\/p>)
Regex untuk Menghapus 2+ kata duplikat (kata berurutan / tidak berurutan)
Coba regex ini yang dapat menangkap 2 atau lebih kata duplikat dan hanya meninggalkan satu kata. Dan kata - kata duplikatnya bahkan tidak harus berurutan .
Di sini,
\b
digunakan untuk Word Boundary,?=
digunakan untuk lookahead positif, dan\1
digunakan untuk referensi balik.Contoh Sumber
sumber
"the cat sat on the mat"
->" cat sat on the mat"
Contoh di Javascript: The Good Parts dapat disesuaikan untuk melakukan ini:
\ b menggunakan \ w untuk batas kata, di mana \ w sama dengan [0-9A-Z_a-z]. Jika Anda tidak keberatan dengan batasan itu, jawaban yang diterima baik-baik saja.
sumber
Karena beberapa pengembang datang ke halaman ini untuk mencari solusi yang tidak hanya menghilangkan duplikat substring non-spasi kosong, tetapi tiga kali lipat dan seterusnya, saya akan menunjukkan pola yang disesuaikan.
Pola:
/(\b\S+)(?:\s+\1\b)+/
( Demo Pola )Ganti:
$1
(menggantikan pertandingan fullstring dengan grup penangkapan # 1)Pola ini secara serakah mencocokkan substring non spasi kosong "utuh", kemudian memerlukan satu atau lebih salinan substring yang cocok yang mungkin dibatasi oleh satu atau lebih karakter spasi putih (spasi, tab, baris baru, dll).
Secara khusus:
\b
Karakter (batas kata) sangat penting untuk memastikan sebagian kata tidak cocok.+
(satu atau lebih pembilang) pada grup non-capturing lebih tepat daripada*
karena*
akan "mengganggu" mesin regex untuk menangkap dan mengganti kejadian tunggal - ini adalah desain pola yang boros.* Catatan jika Anda berurusan dengan kalimat atau string input dengan tanda baca, maka polanya perlu disempurnakan lebih lanjut.
sumber
Ekspresi ini (terinspirasi dari Mike, di atas) tampaknya menangkap semua duplikat, rangkap tiga, dll, termasuk yang ada di akhir string, yang sebagian besar tidak:
Saya tahu pertanyaan yang diminta untuk mencocokkan duplikat saja, tetapi rangkap tiga hanyalah 2 duplikat di samping satu sama lain :)
Pertama, saya
(^|\s+)
pastikan itu dimulai dengan kata lengkap, jika tidak "steak anak" akan menjadi "steak anak" ("s" akan cocok). Kemudian, itu cocok dengan semua kata lengkap ((\b\S+\b)
), diikuti dengan akhir string ($
) atau sejumlah spasi (\s+
), keseluruhannya diulang lebih dari sekali.Saya mencobanya seperti ini dan berhasil dengan baik:
sumber
\b
akhir seperti/(^|\s+)(\S+)(($|\s+)\2)+\b/g, "$1$2")
ini : Ini kemudian akan bekerja untuk situasi seperti ini:the the string String string stringing the the along the the string
akan menjadithe string stringing the along the string
Noticestring stringing
. Itu cocok dengan jawaban Anda. Terima kasih.Gunakan ini jika Anda ingin pemeriksaan case-insensitive untuk kata-kata duplikat.
sumber