Berkat dunia literal template yang menakjubkan, Anda sekarang dapat menulis regex bersarang besar, multi-baris, memiliki komentar yang baik, dan bahkan semantik di ES6.
let clean = (piece) => (piece
.replace(/((^|\n)(?:[^\/\\]|\/[^*\/]|\\.)*?)\s*\/\*(?:[^*]|\*[^\/])*(\*\/|)/g, '$1')
.replace(/((^|\n)(?:[^\/\\]|\/[^\/]|\\.)*?)\s*\/\/[^\n]*/g, '$1')
.replace(/\n\s*/g, '')
);
window.regex = ({raw}, ...interpolations) => (
new RegExp(interpolations.reduce(
(regex, insert, index) => (regex + insert + clean(raw[index + 1])),
clean(raw[0])
))
);
Dengan menggunakan ini, Anda sekarang dapat menulis ekspresi reguler seperti ini:
let re = regex`I'm a special regex{3} //with a comment!`;
Keluaran
/I'm a special regex{3}/
Atau bagaimana dengan multiline?
'123hello'
.match(regex`
//so this is a regex
//here I am matching some numbers
(\d+)
//Oh! See how I didn't need to double backslash that \d?
([a-z]{1,3}) /*note to self, this is group #2*/
`)
[2]
Hasil hel
, rapi!
"Bagaimana jika saya benar-benar perlu mencari baris baru?", Baiklah gunakan \n
konyol!
Bekerja di Firefox dan Chrome saya.
Oke, "bagaimana dengan sesuatu yang sedikit lebih rumit?"
Tentu, ini adalah bagian dari objek yang merusak parser JS yang saya kerjakan :
regex`^\s*
(
//closing the object
(\})|
//starting from open or comma you can...
(?:[,{]\s*)(?:
//have a rest operator
(\.\.\.)
|
//have a property key
(
//a non-negative integer
\b\d+\b
|
//any unencapsulated string of the following
\b[A-Za-z$_][\w$]*\b
|
//a quoted string
//this is #5!
("|')(?:
//that contains any non-escape, non-quote character
(?!\5|\\).
|
//or any escape sequence
(?:\\.)
//finished by the quote
)*\5
)
//after a property key, we can go inside
\s*(:|)
|
\s*(?={)
)
)
((?:
//after closing we expect either
// - the parent's comma/close,
// - or the end of the string
\s*(?:[,}\]=]|$)
|
//after the rest operator we expect the close
\s*\}
|
//after diving into a key we expect that object to open
\s*[{[:]
|
//otherwise we saw only a key, we now expect a comma or close
\s*[,}{]
).*)
$`
Ini menghasilkan /^\s*((\})|(?:[,{]\s*)(?:(\.\.\.)|(\b\d+\b|\b[A-Za-z$_][\w$]*\b|("|')(?:(?!\5|\\).|(?:\\.))*\5)\s*(:|)|\s*(?={)))((?:\s*(?:[,}\]=]|$)|\s*\}|\s*[{[:]|\s*[,}{]).*)$/
Dan menjalankannya dengan sedikit demo?
let input = '{why, hello, there, "you huge \\"", 17, {big,smelly}}';
for (
let parsed;
parsed = input.match(r);
input = parsed[parsed.length - 1]
) console.log(parsed[1]);
Keluaran berhasil
{why
, hello
, there
, "you huge \""
, 17
,
{big
,smelly
}
}
Perhatikan keberhasilan menangkap string yang dikutip.
Saya mengujinya di Chrome dan Firefox, berhasil!
Jika penasaran, Anda dapat melihat apa yang saya lakukan , dan peragaannya .
Meskipun hanya berfungsi di Chrome, karena Firefox tidak mendukung referensi latar atau grup bernama. Jadi perhatikan bahwa contoh yang diberikan dalam jawaban ini sebenarnya adalah versi yang disterilkan dan mungkin dengan mudah ditipu untuk menerima string yang tidak valid.
/\S+@\S+\.\S+/
?