Saya merancang penguji ekspresi reguler dalam HTML dan JavaScript. Pengguna akan memasukkan regex, string, dan memilih fungsi yang ingin mereka uji (mis. Mencari, mencocokkan, mengganti, dll.) Melalui tombol radio dan program akan menampilkan hasil ketika fungsi itu dijalankan dengan argumen yang ditentukan. Tentu akan ada kotak teks tambahan untuk menggantikan argumen tambahan dan semacamnya.
Masalah saya adalah mendapatkan string dari pengguna dan mengubahnya menjadi ekspresi reguler. Jika saya mengatakan bahwa mereka tidak perlu memiliki //
sekitar regex yang mereka masukkan, maka mereka tidak dapat mengatur bendera, seperti g
dan i
. Jadi mereka harus memiliki //
sekitar ekspresi, tetapi bagaimana saya bisa mengubah string itu menjadi sebuah regex? Ini tidak bisa menjadi literal karena sebuah string, dan saya tidak bisa meneruskannya ke konstruktor RegExp karena itu bukan string tanpa //
's. Apakah ada cara lain untuk membuat string input pengguna menjadi sebuah regex? Apakah saya harus mengurai string dan bendera regex dengan //
's kemudian membangunnya dengan cara lain? Haruskah saya minta mereka memasukkan string, dan kemudian memasukkan bendera secara terpisah?
sumber
var re = new RegExp("\\w+");
<input>
tag HTML.var re = new RegExp("\"\\w+\"");
adalah contoh dari regex kode keras menggunakan konstruktor RegExp dan melarikan diri dari tanda kutip ganda adalah diperlukan. Apa yang saya maksud dengan string dalam sebuah variabel adalah bahwa Anda hanya dapat melakukanvar re = new RegExp(str);
danstr
mungkin mengandung tanda kutip ganda atau garis miring terbalik tanpa masalah.atau
sumber
/\/
dikenali.Berikut ini adalah one-liner:
str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')
Saya mendapatkannya dari modul NPM escape-string-regexp .
Cobalah:
Menggunakan literal templat yang ditandai dengan dukungan bendera:
sumber
Gunakan konstruktor objek JavaScript RegExp .
Anda bisa meneruskan flag sebagai argumen string kedua ke konstruktor. Lihat dokumentasi untuk detailnya.
sumber
Dalam kasus saya, input pengguna kadang-kadang dikelilingi oleh pembatas dan terkadang tidak. oleh karena itu saya menambahkan kasus lain ..
sumber
.split()
fungsi alih-alih string regex yang panjang.regParts = inputstring.split('/')
ini akan membuatregParts[1]
string regex, danregParts[2]
pembatas (dengan asumsi pengaturan regex adalah/.../gim
). Anda dapat memeriksa apakah ada pembatas denganregParts[2].length < 0
.Saya sarankan Anda juga menambahkan kotak centang terpisah atau bidang teks untuk bendera khusus. Dengan begitu jelas bahwa pengguna tidak perlu menambahkan apapun
//
. Dalam hal penggantian, berikan dua bidang teks. Ini akan membuat hidup Anda jauh lebih mudah.Mengapa? Karena kalau tidak, beberapa pengguna akan menambahkan
//
sementara yang lain tidak. Dan beberapa akan membuat kesalahan sintaksis. Kemudian, setelah Anda menghapus//
's, Anda mungkin berakhir dengan regex yang valid secara sintaksis yang tidak seperti apa yang dimaksudkan pengguna, yang mengarah ke perilaku aneh (dari perspektif pengguna).sumber
Ini akan berfungsi juga ketika string tidak valid atau tidak mengandung flag, dll:
sumber
Jika Anda benar - benar ingin mengonversi string menjadi regex, coba gunakan fungsi berikut:
Anda dapat menggunakannya seperti ini:
Untuk referensi, ini adalah versi yang diformat dan lebih modern:
sumber
Berkat jawaban sebelumnya, blok ini berfungsi dengan baik sebagai solusi tujuan umum untuk menerapkan string yang dapat dikonfigurasi ke dalam RegEx .. untuk memfilter teks:
sumber
Anda dapat meminta bendera menggunakan kotak centang lalu melakukan sesuatu seperti ini:
sumber
Saya gunakan
eval
untuk menyelesaikan masalah ini.Sebagai contoh:
sumber