Apakah mungkin melakukan hal seperti ini?
var pattern = /some regex segment/ + /* comment here */
/another segment/;
Atau apakah saya harus menggunakan RegExp()
sintaks baru dan menyatukan string? Saya lebih suka menggunakan literal karena kodenya lebih jelas dan ringkas.
javascript
regex
syntax
kelopak mata
sumber
sumber
let regexSegment1 = String.raw`\s*hello\s*`
Jawaban:
Berikut adalah cara membuat ekspresi reguler tanpa menggunakan sintaks literal ekspresi reguler. Ini memungkinkan Anda melakukan manipulasi string arbiter sebelum menjadi objek ekspresi reguler:
Jika Anda memiliki dua literal ekspresi reguler, Anda dapat menggabungkannya menggunakan teknik ini:
Itu hanya lebih bertele-tele daripada hanya memiliki ekspresi satu dan dua menjadi string literal daripada ekspresi reguler literal.
sumber
new RegExp(/(/.source + /.*/.source + /)?/.source);
sepertinya tidak berhasil.expression_one
berasal? Apakah yang Anda maksudregex1
?Hanya objek - objek ekspresi reguler yang digabungkan secara acak dapat memiliki beberapa efek samping yang merugikan. Gunakan sumber RegExp.sebagai gantinya:
Ini juga akan memberi Anda kemampuan untuk mempertahankan flag ekspresi reguler dari RegExp sebelumnya menggunakan flag RegExp standar.
jsFiddle
sumber
RegExp.prototype.flags
Saya tidak begitu setuju dengan opsi "eval".
akan memberikan "// abcd // efgh //" yang bukan hasil yang diinginkan.
Menggunakan sumber suka
akan memberikan "/ abcdefgh /" dan itu benar.
Logicaly tidak perlu MENGEVALUASI, Anda tahu EKSPRESI Anda. Anda hanya perlu SUMBER nya atau bagaimana itu ditulis tidak perlu nilainya. Adapun bendera, Anda hanya perlu menggunakan argumen opsional dari RegExp.
Dalam situasi saya, saya berlari dalam masalah ^ dan $ digunakan dalam beberapa ekspresi yang saya coba gabungkan bersama! Ekspresi tersebut adalah filter tata bahasa yang digunakan di seluruh program. Sekarang saya tidak ingin menggunakan beberapa dari mereka bersama-sama untuk menangani kasus KATA DEPAN. Saya mungkin harus "mengiris" sumber untuk menghapus awal dan akhir ^ (dan / atau) $ :) Cheers, Alex.
sumber
var regex = "\.\..*"
Masalah Jika regexp berisi grup pencocokan-balik seperti \ 1.
Maka hanya mengkombinasikan sumber tidak akan bekerja. Memang, kombinasi keduanya adalah:
Solusinya: Pertama kita menghitung jumlah kelompok yang cocok di regex pertama, Kemudian untuk setiap token yang cocok di yang kedua, kita menambahnya dengan jumlah kelompok yang cocok.
Uji:
sumber
function concatenateList() { var res = arguments[0]; for(var i = 1; i < arguments.length; i++) { res = concatenate(res, arguments[i]); } return res; }
Akan lebih baik menggunakan sintaksis literal sesering mungkin. Ini lebih pendek, lebih terbaca, dan Anda tidak perlu tanda kutip melarikan diri atau serangan balasan melarikan diri ganda. Dari "Pola Javascript", Stoyan Stefanov 2010.
Tetapi menggunakan New mungkin satu-satunya cara untuk menggabungkan.
Saya akan menghindari eval. Itu tidak aman.
sumber
Asalkan:
/this/g
daripadanew RegExp('this', 'g')
;Maka Anda mungkin ingin menulis seperti ini:
Anda kemudian dapat melakukan sesuatu seperti:
Dalam kasus khusus saya (editor seperti kode), jauh lebih mudah untuk melakukan satu regex besar, daripada banyak penggantian seperti mengikuti karena setiap kali saya mengganti dengan tag html untuk membungkus ekspresi, pola selanjutnya akan lebih sulit untuk target tanpa mempengaruhi tag html itu sendiri (dan tanpa baik lookbehind yang sayangnya tidak didukung dalam javascript):
sumber
Anda dapat melakukan sesuatu seperti:
Segmen akan berupa string (bukan regex literal) yang diteruskan sebagai argumen terpisah.
sumber
Tidak, cara literalnya tidak didukung. Anda harus menggunakan RegExp.
sumber
Gunakan konstruktor dengan 2 params dan hindari masalah dengan trailing '/':
sumber
Anda bisa menggabungkan sumber regex dari kelas literal dan RegExp:
sumber
cara yang lebih mudah bagi saya adalah menggabungkan sumber, mis .:
nilai c akan menghasilkan:
sumber
Saya lebih suka menggunakan
eval('your expression')
karena tidak menambahkan/
pada setiap akhir/
yang='new RegExp'
tidak.sumber