Saya mencari solusi RegEx yang rapi untuk diganti
- Semua Karakter non-Alpha-Numeric
- Semua Baris Baru
- Semua beberapa contoh ruang putih
Dengan satu ruang
Bagi mereka yang bermain di rumah ( yang berikut ini tidak bekerja )
text.replace(/[^a-z0-9]/gmi, " ").replace(/\s+/g, " ");
Pemikiran saya adalah RegEx mungkin cukup kuat untuk mencapai ini dalam satu pernyataan. Komponen yang saya pikir perlu id adalah
[^a-z0-9]
- untuk menghapus karakter non-Alpha-Numeric\s+
- Cocok dengan koleksi ruang apa pun\r?\n|\r
- cocok dengan semua baris baru/gmi
- global, multi-line, tidak sensitif huruf
Namun, sepertinya saya tidak bisa mengatur regex dengan cara yang benar ( berikut ini tidak berfungsi )
text.replace(/[^a-z0-9]|\s+|\r?\n|\r/gmi, " ");
Memasukkan
234&^%,Me,2 2013 1080p x264 5 1 BluRay
S01(*&asd 05
S1E5
1x05
1x5
Output yang Diinginkan
234 Me 2 2013 1080p x264 5 1 BluRay S01 asd 05 S1E5 1x05 1x5
Jawaban:
Sadarilah, itu
\W
meninggalkan garis bawah . Setara singkat untuk[^a-zA-Z0-9]
akan[\W_]
\W
adalah negasi singkatan\w
untuk[A-Za-z0-9_]
karakter kata (termasuk garis bawah)Contoh di regex101.com
sumber
\W
juga akan mengenali karakter non-Latin sebagai karakter non-kata.Jonny 5 mengalahkan saya untuk itu. Saya akan menyarankan menggunakan
\W+
tanpa\s
ditext.replace(/\W+/g, " ")
. Ini mencakup ruang putih juga.sumber
\W+
, bukan[W+]
Yah, selamat tahun baru semua!&
dan-
. Ada tips?Karena
[^a-z0-9]
kelas karakter berisi semua yang bukan alnum, kelas itu juga mengandung karakter putih!sumber
Yah saya pikir Anda hanya perlu menambahkan quantifier untuk setiap pola. Juga hal carriage-return agak lucu:
mengedit The
\s
Hal pertandingan\r
dan\n
juga.sumber
A melihat pos berbeda yang juga memiliki tanda diakritik, yang sangat bagus
s.replace(/[^a-zA-Z0-9À-ž\s]/g, "")
sumber
Ini adalah posting lama saya, jawaban yang diterima sebagian besar baik. Namun saya memutuskan untuk membandingkan setiap solusi dan solusi yang jelas lainnya (hanya untuk bersenang-senang). Saya bertanya-tanya apakah ada perbedaan antara pola regex pada browser yang berbeda dengan string berukuran berbeda.
Jadi pada dasarnya saya menggunakan jsPerf pada
Pola regex yang saya uji adalah
/[\W_]+/g
/[^a-z0-9]+/gi
/[^a-zA-Z0-9]+/g
Saya memuatnya dengan string panjang karakter acak
Contoh javascript yang saya gunakan
var newstr = str.replace(/[\W_]+/g," ");
Setiap proses terdiri dari 50 atau lebih sampel pada setiap regex, dan saya menjalankannya 5 kali pada setiap browser.
Mari kita membalap kuda kita!
Hasil
Sejujurnya, Regex di kedua browser (dengan mempertimbangkan penyimpangan) hampir tidak bisa dibedakan, namun saya pikir jika dijalankan lebih sering lagi hasilnya akan menjadi sedikit lebih jelas (tetapi tidak banyak).
Skala teoretis untuk 1 karakter
Saya tidak akan mengambil banyak ke dalam hasil ini karena ini tidak benar-benar perbedaan yang signifikan, yang bisa kita katakan adalah edge lebih lambat: o. Selain itu saya sangat bosan.
Pokoknya Anda bisa menjalankan benchmark sendiri.
Jsperf Tolok Ukur di sini
sumber
Untuk mengganti dengan tanda hubung, lakukan hal berikut:
sumber