Hapus bukan karakter alfanumerik dari string

224

Saya ingin mengonversi string berikut ke output yang disediakan.

Input:  "\\test\red\bob\fred\new"
Output: "testredbobfrednew"

Aku sudah tidak menemukan solusi yang akan menangani karakter khusus seperti \r, \n, \b, dll

Pada dasarnya saya hanya ingin menyingkirkan apa saja yang tidak alfanumerik. Inilah yang saya coba ...

Attempt 1: "\\test\red\bob\fred\new".replace(/[_\W]+/g, "");
Output 1:  "testedobredew"

Attempt 2: "\\test\red\bob\fred\new".replace(/['`~!@#$%^&*()_|+-=?;:'",.<>\{\}\[\]\\\/]/gi, "");
Output 2:  "testedobred [newline] ew"

Attempt 3: "\\test\red\bob\fred\new".replace(/[^a-zA-Z0-9]/, "");
Output 3:  "testedobred [newline] ew"

Attempt 4: "\\test\red\bob\fred\new".replace(/[^a-z0-9\s]/gi, '');
Output 4:  "testedobred [newline] ew"

Satu lagi upaya dengan beberapa langkah

function cleanID(id) {
    id = id.toUpperCase();
    id = id.replace( /\t/ , "T");
    id = id.replace( /\n/ , "N");
    id = id.replace( /\r/ , "R");
    id = id.replace( /\b/ , "B");
    id = id.replace( /\f/ , "F");
    return id.replace( /[^a-zA-Z0-9]/ , "");
}

dengan hasil

Attempt 1: cleanID("\\test\red\bob\fred\new");
Output 1: "BTESTREDOBFREDNEW"

Bantuan apa pun akan dihargai.

Solusi kerja:

Final Attempt 1: return JSON.stringify("\\test\red\bob\fred\new").replace( /\W/g , '');
Output 1: "testredbobfrednew"
Bobby Cannon
sumber
Pertanyaan menarik, \ n di \ baru jelas-jelas apa yang menyebabkannya tersandung. Saya tidak sepenuhnya yakin bagaimana menemukan dan menggantinya meskipun pergi mencari regex pada karakter khusus whitespate
Will Buck
1
Apakah input lolos / bagaimana mereka ditugaskan? var Input = "\\test\red\bob\fred\new"string ini tidak mengandung "merah" sehingga upaya pertama Anda benar, apakah Anda menguji terhadap litteral "\\\\test\\red\\bob\\fred\\new"?
Alex K.
/[^\w\s]+/gicoba ini.
Bartosz Grzybowski
Saya kira pertanyaannya adalah, apakah garis miring terbalik di string masukan Anda mewakili karakter khusus? (Berdasarkan hasil contoh Anda, saya kira tidak.)
Dave
Sudah mencoba beralih dari tanda kutip ganda ke tanda kutip tunggal?
OptimusCrime

Jawaban:

468

Menghapus karakter non-alfanumerik

Berikut ini adalah / regex yang benar untuk menghapus karakter non-alfanumerik dari string input:

input.replace(/\W/g, '')

Perhatikan bahwa \Witu setara dengan [^0-9a-zA-Z_]- itu termasuk karakter garis bawah. Untuk juga menghapus garis bawah, gunakan misalnya:

input.replace(/[^0-9a-z]/gi, '')

Input salah

Karena string uji berisi berbagai karakter yang lolos, yang bukan merupakan alfanumerik, itu akan menghapusnya.

Garis miring terbalik di dalam string harus keluar jika harus dipahami secara harfiah:

"\\test\\red\\bob\\fred\\new".replace(/\W/g, '')
"testredbobfrednew" // output

Menangani string yang cacat

Jika Anda tidak dapat keluar dari string input dengan benar (mengapa tidak?), Atau itu berasal dari beberapa sumber yang tidak terpercaya / salah konfigurasi - Anda dapat melakukan sesuatu seperti ini:

JSON.stringify("\\test\red\bob\fred\new").replace(/\W/g, '')
"testredbobfrednew" // output

Perhatikan bahwa representasi json dari sebuah string menyertakan tanda kutip:

JSON.stringify("\\test\red\bob\fred\new")
""\\test\red\bob\fred\new""

Tetapi mereka juga dihapus oleh regex pengganti.

AD7six
sumber
10
Ini tidak menghapus garis bawah.
Kylex
4
@kylex, itu karena garis bawah dianggap sebagai bagian dari kumpulan alfanumerik, untuk beberapa alasan
Eugene Kuzmenko
12
"Karena mereka adalah karakter yang biasanya legal dalam pengidentifikasi variabel." . Tidak ada "_" dalam pertanyaan, tentu saja diganti \Wdengan [_\W](yang digunakan dalam pertanyaan) atau yang serupa akan menghapus garis bawah.
AD7six
1
@ AD7six, bisa tolong jelaskan mengapa seseorang harus menggunakan JSON.stringify () ketika string berasal dari sumber yang tidak dipercaya? Apakah ada masalah keamanan untuk tidak melakukannya? Terima kasih!
jbmusso
1
@guithor Bukan berarti "harus", atau memengaruhi keamanan sama sekali; Jika "beberapa string" diterima dan untuk alasan apa pun pada dasarnya borked (Tidak jelas dari pertanyaan mengapa string diterima cacat) - memungkinkan melihat string apa adanya: jsfiddle.net/Z6N7C
AD7six
49

Semua jawaban saat ini masih memiliki keanehan, hal terbaik yang bisa saya dapatkan adalah:

string.replace(/[^A-Za-z0-9]/g, '');

Inilah contoh yang menangkap setiap tombol yang dapat saya temukan di keyboard:

var string = '123abcABC-_*(!@#$%^&*()_-={}[]:\"<>,.?/~`';
var stripped = string.replace(/[^A-Za-z0-9]/g, '');
console.log(stripped);

Output: '123abcABC'

Deminetix
sumber
1
input.replace(/\W/g, '')daun di _dalam sebuah String. @ Deminetix benar string.replace(/[^A-Za-z0-9]/g, '');berfungsi lebih baik karena menghapus semua karakter non-alfanumerik dari String.
Tim
1
Namun, tidak ada permutasi dari jawaban ini yang benar-benar menjawab pertanyaan yang diajukan .
AD7six
10

Masalahnya bukan dengan bagaimana Anda mengganti karakter, masalahnya adalah bagaimana Anda memasukkan string.

Ini hanya backslash pertama di masukan yang adalah karakter backslash, yang lain adalah bagian dari karakter kontrol \r, \b, \fdan \n.

Karena garis miring terbalik itu bukan karakter yang terpisah, tetapi bagian dari notasi untuk menulis karakter kontrol tunggal, mereka tidak dapat dihapus secara terpisah. Yaitu Anda tidak dapat menghapus garis miring terbalik \nkarena bukan dua karakter yang terpisah, itu adalah cara Anda menulis karakter kontrol LF, atau umpan baris .

Jika Anda benar-benar ingin mengubah input itu menjadi output yang diinginkan, Anda perlu mengganti setiap karakter kontrol dengan huruf yang sesuai, misalnya mengganti karakter \ndengan karakter n.

Untuk mengganti karakter kontrol, Anda perlu menggunakan set karakter seperti [\r], karena \rmemiliki makna khusus dalam ekspresi reguler:

var input = "\\test\red\bob\fred\new";

var output = input
    .replace(/[\r]/g, 'r')
    .replace(/[\b]/g, 'b')
    .replace(/[\f]/g, 'f')
    .replace(/[\n]/g, 'n')
    .replace(/\\/g, '');

Demo: http://jsfiddle.net/SAp4W/

Guffa
sumber
Saya mengerti semua yang Anda katakan tetapi pertanyaannya tetap ada dan belum ada yang menyarankan jawaban yang benar. Input bisa berupa perubahan tetapi tidak ada yang menyarankan jawaban tentang bagaimana cara mengubahnya secara JS.
Bobby Cannon
2
@ BobbyCannon: Saya menambahkan kode yang mengambil input tepat Anda dan menghasilkan output yang diinginkan.
Guffa
5

Anda dapat mencoba regex ini:

value.replace(/[\W_-]/g, '');
myrcutio
sumber
per pertanyaan: Saya hanya ingin menyingkirkan apa pun yang bukan alfanumerik. output apa yang Anda harapkan?
myrcutio
0

Ini menghapus semua karakter non-alfanumerik, mempertahankan penggunaan huruf besar, dan menjaga jarak antar kata.

function alpha_numeric_filter (string) {

  const alpha_numeric = Array.from('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + ' ')

  const json_string = JSON.stringify(string)

  let filterd_string = ''

  for (let i = 0; i < json_string.length; i++) {

    let char = json_string[i]
    let index = alpha_numeric.indexOf(char)
    if (index > -1) {
      filterd_string += alpha_numeric[index]
    }

  }

  return filterd_string

}

const input = "\\test\red\bob\fred\new"
console.log(alpha_numeric_filter(input)) //=> testredbobfrednew

const complex_string = "/_&_This!&!! is!@#$% a%^&*() Sentence+=-[]{} 123:;\|\\]||~`/.,><"
console.log(alpha_numeric_filter(complex_string)) //=> This is a Sentence 123
Flavio
sumber
Itu tidak berhasil (harap baca pertanyaannya) - Ini juga cara yang agak rumit dalam melakukan sesuatu.
AD7six
1
@ AD7six terima kasih telah menunjukkan kesalahan saya. Ketika saya menyalin menempelkan input ke WebStrom secara otomatis menambahkan 2 backslash tambahan untuk setiap backslash yang ada. Saya gagal melihat ini. input = "\\ test \ red \ bob \ fred \ new" -> copy_paste = "test \\ merah \\ bob \\ fred \\ baru".
Flavio
-1

Ini adalah contoh yang bisa Anda gunakan,

function removeNonAplhaNumeric(str){
    return str.replace(/[\W_]/g,"");
}

removeNonAplhaNumeric("0_0 (: /-\ :) 0-0");
ravi kishore
sumber
-3

Jika Anda ingin memiliki \\test\red\bob\fred\newstring ini , Anda harus menghindari semua garis miring terbalik ( \). Ketika Anda menulis \\test\\red\\bob\\fred\\newstring Anda sebenarnya mengandung garis miring terbalik tunggal. Anda dapat yakin akan hal ini mencetak string Anda.
Jadi jika garis miring terbalik di string Anda lolos myString.replace(/\W/g,'')akan bekerja secara normal.

shift66
sumber
1
Jika Anda ingin menyarankan untuk "Anda harus melarikan diri dari semua garis miring terbalik ()" maka Anda perlu memberikan contoh tentang cara melakukannya.
Bobby Cannon
Apa yang Anda lakukan backslashes ganda ??? dan apa yang saya katakan "Ketika Anda menulis \\ test \\ red \\ bob \\ fred \\ new string Anda sebenarnya mengandung garis miring terbalik tunggal." ??? Apakah ini tidak menjelaskan?
shift66
Inputnya adalah "\\ test \ red \ bod \ fred \ new" dan tidak dapat diubah. Saya butuh solusi untuk string input itu. Jika Anda ingin menunjukkan kepada saya cara "mengecas backslash" maka berikan contoh. Kami tidak dapat mengubah input. Lihat jawaban yang diterima. Solusi memungkinkan input tidak berubah tetapi memberikan output yang diinginkan.
Bobby Cannon