Nhờ vào thế giới tuyệt vời của các mẫu chữ, giờ đây bạn có thể viết các biểu thức lớn, đa dòng, được nhận xét tốt và thậm chí về ngữ nghĩa được lồng trong ngữ nghĩa trong 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])
))
);
Sử dụng cái này bây giờ bạn có thể viết regexes như thế này:
let re = regex`I'm a special regex{3} //with a comment!`;
Đầu ra
/I'm a special regex{3}/
Hay những gì về 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]
Đầu ra hel
, gọn gàng!
"Điều gì sẽ xảy ra nếu tôi thực sự cần tìm kiếm một dòng mới?", Vậy thì hãy sử dụng một cách \n
ngớ ngẩn!
Hoạt động trên Firefox và Chrome của tôi.
Được rồi, "làm thế nào về một cái gì đó phức tạp hơn một chút?"
Chắc chắn, đây là một phần của một đối tượng phá hủy trình phân tích cú pháp JS mà tôi đang làm việc :
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*[,}{]
).*)
$`
Nó xuất ra /^\s*((\})|(?:[,{]\s*)(?:(\.\.\.)|(\b\d+\b|\b[A-Za-z$_][\w$]*\b|("|')(?:(?!\5|\\).|(?:\\.))*\5)\s*(:|)|\s*(?={)))((?:\s*(?:[,}\]=]|$)|\s*\}|\s*[{[:]|\s*[,}{]).*)$/
Và chạy nó với một bản demo nhỏ?
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]);
Đầu ra thành công
{why
, hello
, there
, "you huge \""
, 17
,
{big
,smelly
}
}
Lưu ý việc chụp thành công chuỗi trích dẫn.
Tôi đã thử nghiệm nó trên Chrome và Firefox, hoạt động rất tốt!
Nếu tò mò bạn có thể kiểm tra những gì tôi đang làm , và trình diễn của nó .
Mặc dù nó chỉ hoạt động trên Chrome, vì Firefox không hỗ trợ các phản hồi hoặc các nhóm được đặt tên. Vì vậy, lưu ý ví dụ đưa ra trong câu trả lời này thực sự là một phiên bản mới và có thể dễ dàng bị lừa khi chấp nhận các chuỗi không hợp lệ.
/\S+@\S+\.\S+/
?