Şablon değişmezlerinin harika dünyası sayesinde artık ES6'da büyük, çok satırlı, iyi yorumlanmış ve hatta anlamsal olarak iç içe regex'ler yazabilirsiniz.
//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])
))
);
Bunu kullanarak artık aşağıdaki gibi normal ifadeler yazabilirsiniz:
let re = regex`I'm a special regex{3} //with a comment!`;
çıktılar
/I'm a special regex{3}/
Ya da çok satırlı?
'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]
Çıktılar hel
, temiz!
"Ne Aslında bir yeni satır aramanıza gerek olur?", İyi o kullanmak \n
saçma!
Firefox ve Chrome'um üzerinde çalışıyor.
Tamam, "biraz daha karmaşık bir şeye ne dersin?"
Tabii, işte üzerinde çalıştığım JS ayrıştırıcısını bir nesne parçası :
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*[,}{]
).*)
$`
Çıktı /^\s*((\})|(?:[,{]\s*)(?:(\.\.\.)|(\b\d+\b|\b[A-Za-z$_][\w$]*\b|("|')(?:(?!\5|\\).|(?:\\.))*\5)\s*(:|)|\s*(?={)))((?:\s*(?:[,}\]=]|$)|\s*\}|\s*[{[:]|\s*[,}{]).*)$/
Ve küçük bir demo ile mi çalıştırıyorsunuz?
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]);
Başarıyla çıktı
{why
, hello
, there
, "you huge \""
, 17
,
{big
,smelly
}
}
Alıntılanan dizenin başarılı bir şekilde yakalandığına dikkat edin.
Chrome ve Firefox'ta test ettim, bir tedavi yapıyor!
Eğer merak ne yaptığımı ödeme yapabilirsiniz ve onun gösteri .
Firefox geri başvuruları veya adlandırılmış grupları desteklemediğinden, yalnızca Chrome'da çalışıyor olsa da. Bu nedenle, bu cevapta verilen örneğin aslında kısırlaştırılmış bir sürüm olduğunu ve geçersiz dizeleri kabul etmek için kolayca kandırılabileceğini unutmayın.
/\S+@\S+\.\S+/
?