Dank der wunderbaren Welt der Vorlagenliterale können Sie jetzt große, mehrzeilige, gut kommentierte und sogar semantisch verschachtelte reguläre Ausdrücke in ES6 schreiben.
//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])
))
);
Auf diese Weise können Sie jetzt reguläre Ausdrücke wie folgt schreiben:
let re = regex`I'm a special regex{3} //with a comment!`;
Ausgänge
/I'm a special regex{3}/
Oder was ist mit 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]
Ausgänge hel
, ordentlich!
"Was ist, wenn ich tatsächlich eine neue Zeile suchen muss?", Dann benutze \n
dumm!
Ich arbeite an meinem Firefox und Chrome.
Okay, "wie wäre es mit etwas etwas komplexerem?"
Sicher, hier ist ein Teil eines Objekts, das den JS-Parser zerstört, an dem ich gearbeitet habe :
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*[,}{]
).*)
$`
Es gibt aus /^\s*((\})|(?:[,{]\s*)(?:(\.\.\.)|(\b\d+\b|\b[A-Za-z$_][\w$]*\b|("|')(?:(?!\5|\\).|(?:\\.))*\5)\s*(:|)|\s*(?={)))((?:\s*(?:[,}\]=]|$)|\s*\}|\s*[{[:]|\s*[,}{]).*)$/
Und mit einer kleinen 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]);
Erfolgreich ausgegeben
{why
, hello
, there
, "you huge \""
, 17
,
{big
,smelly
}
}
Beachten Sie die erfolgreiche Erfassung der Zeichenfolge in Anführungszeichen.
Ich habe es auf Chrome und Firefox getestet, funktioniert ein Vergnügen!
Wenn Sie neugierig sind, können Sie sich ansehen, was ich getan habe und wie es demonstriert wird .
Dies funktioniert jedoch nur unter Chrome, da Firefox keine Rückreferenzen oder benannten Gruppen unterstützt. Beachten Sie also, dass das in dieser Antwort angegebene Beispiel tatsächlich eine kastrierte Version ist und möglicherweise leicht dazu verleitet wird, ungültige Zeichenfolgen zu akzeptieren.
/\S+@\S+\.\S+/
?