ขอบคุณโลกมหัศจรรย์แห่งเทมเพลตตัวอักษรตอนนี้คุณสามารถเขียนใหญ่หลายบรรทัดแสดงความคิดเห็นดีและแม้กระทั่ง regexes ซ้อนกันเชิงความหมายใน ES6
//build regexes without worrying about
// - double-backslashing
// - adding whitespace for readability
// - adding in comments
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])
))
);
การใช้สิ่งนี้คุณสามารถเขียน regexes ดังนี้:
let re = regex`I'm a special regex{3} //with a comment!`;
เอาท์พุท
/I'm a special regex{3}/
หรือ 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]
เอาท์พุhel
ทเรียบร้อย!
"ถ้าฉันต้องการค้นหาบรรทัดใหม่จริง ๆ " แล้วใช้\n
โง่!
ทำงานกับ Firefox และ Chrome ของฉัน
โอเค "สิ่งที่ซับซ้อนกว่านี้อีกเล็กน้อย"
แน่นอนนี่เป็นชิ้นส่วนของการทำลายวัตถุ JS parser ที่ฉันกำลังทำอยู่ :
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*[,}{]
).*)
$`
มันออกมา /^\s*((\})|(?:[,{]\s*)(?:(\.\.\.)|(\b\d+\b|\b[A-Za-z$_][\w$]*\b|("|')(?:(?!\5|\\).|(?:\\.))*\5)\s*(:|)|\s*(?={)))((?:\s*(?:[,}\]=]|$)|\s*\}|\s*[{[:]|\s*[,}{]).*)$/
และใช้มันด้วยการสาธิตเล็ก ๆ น้อย ๆ ?
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]);
ส่งออกสำเร็จ
{why
, hello
, there
, "you huge \""
, 17
,
{big
,smelly
}
}
สังเกตการจับสำเร็จของสตริงที่ยกมา
ฉันทดสอบมันบน Chrome และ Firefox ทำงานได้ดี!
ถ้าอยากรู้อยากเห็นคุณสามารถเช็คเอาสิ่งที่ผมทำและการสาธิต
แม้ว่ามันจะใช้งานได้กับ Chrome เท่านั้น แต่ Firefox ไม่รองรับการตอบกลับหรือกลุ่มที่มีชื่อ ดังนั้นโปรดสังเกตตัวอย่างที่ให้ไว้ในคำตอบนี้จริงๆแล้วเป็นรุ่น neutered และอาจถูกหลอกได้ง่ายในการยอมรับสตริงที่ไม่ถูกต้อง
/\S+@\S+\.\S+/
?