Saya ingin RegExp yang akan menghapus semua karakter khusus dari sebuah string. Saya mencoba sesuatu seperti ini tetapi tidak berhasil di IE7, meskipun berfungsi di Firefox.
var specialChars = "!@#$^&%*()+=-[]\/{}|:<>?,.";
for (var i = 0; i < specialChars.length; i++) {
stringToReplace = stringToReplace.replace(new RegExp("\\" + specialChars[i], "gi"), "");
}
Penjelasan rinci tentang RegExp akan membantu juga.
javascript
regex
special-characters
Timothy Ruhle
sumber
sumber
Jawaban:
var desired = stringToReplace.replace(/[^\w\s]/gi, '')
Seperti yang disebutkan di komentar, lebih mudah melakukan ini sebagai daftar putih - ganti karakter yang tidak ada di daftar aman Anda.
Karakter caret (
^
) adalah negasi dari himpunan[...]
,gi
katakanlah global dan case-insensitive (yang terakhir agak berlebihan tetapi saya ingin menyebutkannya) dan daftar aman dalam contoh ini adalah digit, karakter kata, garis bawah (\w
) dan spasi (\s
).sumber
Perhatikan bahwa jika Anda masih ingin mengecualikan satu set, termasuk hal-hal seperti garis miring dan karakter khusus, Anda dapat melakukan hal berikut:
var outString = sourceString.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');
perhatikan secara khusus bahwa untuk juga menyertakan karakter "minus", Anda harus menghindarinya dengan garis miring terbalik seperti grup yang terakhir. jika tidak, itu juga akan memilih 0-9 yang mungkin tidak diinginkan.
sumber
?
dari bagian set karakter ke arah depan. ini mencantumkan karakter yang ingin Anda hapus, jadi mengecualikannya agar tidak dilucuti akan secara inheren menyertakannya di hasil akhir.Regex Javascript biasa tidak menangani huruf Unicode .
Jangan gunakan
[^\w\s]
, ini akan menghapus huruf dengan aksen (seperti àèéìòù), belum lagi untuk Cyrillic atau China, huruf yang berasal dari bahasa tersebut akan selesai dihapus.Anda benar-benar tidak ingin menghapus huruf-huruf ini bersama dengan semua karakter khusus. Anda memiliki dua peluang:
misalnya:
[^èéòàùì\w\s]
.\p{...}
sintaks.var str = "Їжак::: résd,$%& adùf" var search = XRegExp('([^?<first>\\pL ]+)'); var res = XRegExp.replace(str, search, '',"all"); console.log(res); // returns "Їжак::: resd,adf" console.log(str.replace(/[^\w\s]/gi, '') ); // returns " rsd adf" console.log(str.replace(/[^\wèéòàùì\s]/gi, '') ); // returns " résd adùf"
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.js"></script>
sumber
Solusi pertama tidak berfungsi untuk alfabet UTF-8 apa pun. (Ini akan memotong teks seperti Їжак). Saya telah berhasil membuat fungsi yang tidak menggunakan RegExp dan menggunakan dukungan UTF-8 yang baik di mesin JavaScript. Idenya sederhana jika sebuah simbol sama dalam huruf besar dan kecil itu adalah karakter khusus. Satu-satunya pengecualian dibuat untuk whitespace.
function removeSpecials(str) { var lower = str.toLowerCase(); var upper = str.toUpperCase(); var res = ""; for(var i=0; i<lower.length; ++i) { if(lower[i] != upper[i] || lower[i].trim() === '') res += str[i]; } return res; }
Pembaruan: Harap dicatat, bahwa solusi ini hanya berfungsi untuk bahasa di mana ada huruf kecil dan kapital. Dalam bahasa seperti China, ini tidak akan berfungsi.
Pembaruan 2: Saya datang ke solusi asli ketika saya sedang mengerjakan pencarian fuzzy. Jika Anda juga mencoba menghapus karakter khusus untuk mengimplementasikan fungsionalitas pencarian, ada pendekatan yang lebih baik. Gunakan pustaka transliterasi apa pun yang akan menghasilkan string hanya dari karakter Latin dan kemudian Regexp sederhana akan melakukan semua keajaiban untuk menghapus karakter khusus. (Ini akan bekerja untuk bahasa Cina juga dan Anda juga akan menerima keuntungan tambahan dengan membuat
Tromsø
==Tromso
).sumber
Saya menggunakan RegexBuddy untuk debbuging regex saya, ia memiliki hampir semua bahasa yang sangat berguna. Dari pada salin / tempel untuk bahasa yang ditargetkan. Alat yang hebat dan tidak terlalu mahal.
Jadi saya menyalin / menempelkan regex Anda dan masalah Anda adalah [,] adalah karakter khusus dalam regex, jadi Anda harus menghindarinya. Jadi regex harus: /!@#$^&%*()+=-[\x5B\x5D]\/{}i>:<>?,./im
sumber
str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")
Saya melakukan sth seperti ini. Tetapi ada beberapa orang yang melakukannya dengan lebih mudah sepertistr.replace(/\W_/g,"");
sumber
\W
mengandung beberapa karakter. Tetapi mengapa Anda memfilter angka? Itu bukan karakter khusus.kenapa kamu tidak melakukan sesuatu seperti:
re = /^[a-z0-9 ]$/i; var isValid = re.test(yourInput);
untuk memeriksa apakah masukan Anda mengandung karakter khusus
sumber
èéòàùì
dan beberapa kasus ini bukan solusi