Hapus semua karakter khusus dengan RegExp

249

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.

Timothy Ruhle
sumber
18
Sesuatu seperti ini akan lebih baik sebagai daftar putih, bukan daftar hitam. maka Anda bisa melakukan [az] | [0-9] | \ s
Ape-inago
Ada kesalahan skrip? Apakah Anda men-debug? Atau coba ... blokir tangkap dalam kode javascript.
Kangkan
@ Ape-inago, bisakah Anda menjelaskan RegExp sedikit lebih banyak kepada saya
Timothy Ruhle
3
Harap definisikan "karakter khusus"! Apakah "風" spesial untukmu? (Berpikir tentang ini, Anda akan melihat poin @ Ape-iango.)
menipu
7
Saya tidak berpikir siapa pun di sini bermaksud tersinggung. Saya pernah terbakar sebelumnya dengan melakukannya sebagai daftar hitam karena selalu ada "gotcha" kecil yang akhirnya lolos (seperti contoh tipuan). Pada akhirnya, pendekatan yang benar lebih tentang mengapa Anda mencoba melakukan ini.
Ape-inago

Jawaban:

642
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 [...], gikatakanlah 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).

annakata
sumber
53
Solusi ini tidak berfungsi untuk simbol non Inggris. "Їжак" misalnya.
Seagull
4
Anda juga dapat menggunakan huruf besar \ W daripada ^ \ w. \ W: Cocok dengan karakter non-kata apa pun. Setara dengan [^ A-Za-z0-9_]. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
delkant
@ Seagull Saya telah menambahkan jawaban yang menangani Unicodes.
freedev
2
untuk menerima aksen kata, seperti dalam bahasa portugis, lakukan ini: stringToReplace.replace (/ [^ A-zÀ-ú \ s] / gi, '')
alansiqueira27
2
Untuk menambahkan sebagian besar bahasa Eropa (Norwegia, Swedia, Jerman, Portoguis, Spanyol) stringToReplace.replace (/ [^ \ w \ s \ xc0-xff] / gi, ''). Untuk memasukkan bahasa lain, rentang unicode dapat digunakan. Lihat: stackoverflow.com/questions/150033/…
Eskil Mjelva Saatvedt
115

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.

noinput
sumber
11
solusi yang sangat baik! jawaban yang diterima hanya berfungsi dalam bahasa Inggris, ini berfungsi pada bahasa apa pun (sejauh yang saya periksa). terima kasih :)
Ronen Ness
1
@knutole hapus ?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.
noinput
Ini berfungsi dengan baik, sangat cocok untuk bahasa apa pun, hanya perlu menambahkan karakter yang ingin Anda ganti dan itu saja. Terima kasih.
Elros Romeo
21

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:

  • Tambahkan regex Anda semua karakter khusus Anda tidak ingin menghapus,
    misalnya: [^èéòàùì\w\s].
  • Silahkan lihat pada xregexp.com . XRegExp menambahkan dukungan dasar untuk pencocokan Unicode melalui \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>

freedev
sumber
3
Baik untuk mengetahui tentang internasionalisasi, saya tidak tahu JS regex tidak berpikiran UTF-8.
LessQuesar
Anda tidak dapat memasukkan semua huruf UTF-8 yang valid ke var str
Seagull
@Seagull ya, tetapi jika Anda tidak menulis aplikasi yang kompatibel di seluruh dunia, Anda dapat secara pragmatis hanya memasukkan daftar huruf UTF-8 yang valid untuk pelokalan Anda saat ini. Dalam kasus saya, untuk bahasa Italia hanya ada beberapa huruf.
freedev
7

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).

Camar
sumber
Luar biasa, seperti jawaban ini! Saya menggunakannya untuk membuat nama file yang valid dan telah memperluas solusi Anda untuk menghapus spasi (kompatibel dengan Linux / Unix) dan mengizinkan nomor juga. Jadi saya memperpanjang pernyataan if (melibatkan jQuery): if (str [i]! == '' && (lower [i]! = Upper [i] || lower [i] .trim () === '' | | $ .isNumeric (str [i])))
Jonny
dalam banyak bahasa tidak ada huruf besar ... oleh karena itu fungsi akan mempertimbangkan input yang valid sebagai karakter khusus
Yair Levy
Karakter Cina adalah salah satu contoh yang dihilangkan oleh ini
lethek
Sayangnya, ketika saya membuat solusi ini, saya tidak memikirkan bahasa seperti bahasa Mandarin. Solusinya harus diusulkan, karena jawaban sebelumnya juga tidak akan berfungsi.
Seagull
1

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

milebii
sumber
0

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,"");

Eldar Mammadov
sumber
Sebagian besar hal dalam pendekatan Anda adalah mubazir, karena \Wmengandung beberapa karakter. Tetapi mengapa Anda memfilter angka? Itu bukan karakter khusus.
pengguna4642212
-1

kenapa kamu tidak melakukan sesuatu seperti:

re = /^[a-z0-9 ]$/i;
var isValid = re.test(yourInput);

untuk memeriksa apakah masukan Anda mengandung karakter khusus

Dan
sumber
18
OP mengatakan dia mencoba menghapus karakter khusus yang tidak melihat apakah mereka ada.
annakata
Ini adalah salah satu solusi yang baik tetapi ini hanya akan mengizinkan nomor huruf alfabet Inggris dan spasi tetapi akan menghapus karakter seperti èéòàùìdan beberapa kasus ini bukan solusi
mapmalith