Asumsi:
var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));
Itu harus melakukan trik ... (jika tujuan Anda adalah mengganti semua tanda kutip ganda).
Begini cara kerjanya:
['"]
adalah kelas karakter, cocok dengan tanda kutip tunggal dan ganda. Anda dapat menggantinya dengan "
hanya mencocokkan tanda kutip ganda.
+
: satu atau lebih tanda kutip, karakter, seperti yang didefinisikan oleh char-class sebelumnya (opsional)
g
: bendera global . Ini memberitahu JS untuk menerapkan regex ke seluruh string. Jika Anda menghilangkan ini, Anda hanya akan mengganti satu karakter.
Jika Anda mencoba untuk menghapus tanda kutip di sekitar string yang diberikan (yaitu berpasangan), semuanya menjadi sedikit lebih rumit. Anda harus menggunakan pernyataan lookaround:
var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove foo delimiting quotes
str = 'remove only "foo" delimiting "';//note trailing " at the end
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove only foo delimiting "<-- trailing double quote is not removed
Regex menjelaskan:
"
: literal, cocok dengan literal apa pun "
(
: mulai menangkap grup. Apa pun yang berada di antara tanda kurung ( ()
) akan ditangkap, dan dapat digunakan dalam nilai penggantian.
[^"]+
: Kelas karakter, cocok semua karakter, kecuali "
1 kali atau lebih
(?=")
: nol-lebar (seperti yang tidak ditangkap) pernyataan lookahead positif. Pertandingan sebelumnya hanya akan valid jika diikuti oleh "
literal
)
: end capturing group, kami telah menangkap semuanya di antara penutupan pembukaan "
"
: satu lagi literal, daftar item cf
Penggantinya adalah '$1'
, ini adalah referensi-kembali ke kelompok yang ditangkap pertama, sedang [^" ]+
, atau setiap di antara tanda kutip ganda. Pola tersebut cocok dengan tanda kutip dan apa yang ada di antara mereka, tetapi menggantinya hanya dengan apa yang ada di antara tanda kutip, sehingga secara efektif menghapusnya.
Apa yang dilakukannya adalah some "string with" quotes
-> diganti "string with"
dengan ->string with
. Kutipan hilang, pekerjaan selesai.
Jika kutipan selalu berada di awal dan akhir string, maka Anda bisa menggunakan ini:
str.replace(/^"(.+(?="$))"$/, '$1');
Dengan input remove "foo" delimiting "
, output akan tetap tidak berubah, tetapi ubah string input menjadi "remove "foo" delimiting quotes"
, dan Anda akan berakhir denganremove "foo" delimiting quotes
sebagai output.
Penjelasan:
^"
: cocok dengan awal string ^
dan a "
. Jika string tidak dimulai dengan a "
, ekspresi sudah gagal di sini, dan tidak ada yang diganti.
(.+(?="$))
: cocok (dan menangkap) semuanya, termasuk tanda kutip ganda satu kali atau lebih, asalkan lookahead positif itu benar
(?="$)
: lookahead positif sama seperti di atas, hanya itu menentukan bahwa "
harus menjadi akhir dari string ($
=== end)
"$
: cocok dengan kutipan yang berakhir, tetapi tidak menangkapnya
Penggantian dilakukan dengan cara yang sama seperti sebelumnya: kami mengganti pertandingan (yang termasuk kutipan pembukaan dan penutupan), dengan semua yang ada di dalamnya.
Anda mungkin memperhatikan bahwa saya telah menghilangkan g
flag (untuk BTW global), karena sejak kami memproses seluruh string, ungkapan ini hanya berlaku sekali.
Regex yang lebih mudah, cukup banyak, hal yang sama (ada perbedaan internal tentang bagaimana regex dikompilasi / diterapkan) adalah:
someStr.replace(/^"(.+)"$/,'$1');
Seperti sebelumnya ^"
dan "$
cocok dengan tanda kutip pembatas di awal dan akhir string, dan cocokkan (.+)
semuanya di antara, dan menangkapnya. Saya sudah mencoba regex ini, di samping yang di atas (dengan pernyataan lookahead) dan, harus diakui, saya terkejut menemukan ini sedikit lebih lambat. Dugaan saya adalah bahwa pernyataan lookaround menyebabkan ekspresi sebelumnya gagal segera setelah mesin menentukan tidak ada "
pada akhir string. Ah well, tetapi jika ini yang Anda inginkan / butuhkan, harap baca terus :
Namun, dalam kasus terakhir ini, ini jauh lebih aman, lebih cepat, lebih dapat dipelihara dan lebih baik untuk melakukan ini:
if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
console.log(str.substr(1,str.length -2));
}
Di sini, saya memeriksa apakah karakter pertama dan terakhir dalam string adalah tanda kutip ganda. Jika ya, saya gunakan substr
untuk memotong karakter pertama dan terakhir. String diindeks nol, jadi karakter terakhir adalah charAt(str.length -1)
. substr
mengharapkan 2 argumen, di mana yang pertama adalah offset tempat substring dimulai, yang kedua adalah panjangnya. Karena kita tidak menginginkan char terakhir, lebih dari yang kita inginkan dulu, panjangnya adalah str.length - 2
. Mudah sekali.
Kiat :
Lebih lanjut tentang pernyataan lookaround dapat ditemukan di sini
Regex sangat berguna (dan IMO menyenangkan), dapat sedikit membingungkan pada awalnya. Berikut beberapa detail lainnya, dan tautan ke sumber daya tentang masalah ini.
Jika Anda belum terlalu nyaman menggunakan regex, Anda mungkin ingin mempertimbangkan untuk menggunakan:
var noQuotes = someStr.split('"').join('');
Jika ada banyak kutipan dalam string, ini bahkan mungkin lebih cepat daripada menggunakan regex