Ich habe einen sehr langen regulären Ausdruck, den ich in meinem JavaScript-Code in mehrere Zeilen aufteilen möchte, damit jede Zeilenlänge gemäß den JSLint-Regeln 80 Zeichen lang bleibt. Es ist einfach besser zum Lesen, denke ich. Hier ist ein Musterbeispiel:
var pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
javascript
regex
jslint
expression
readability
Nik Sumeiko
quelle
quelle
/\S+@\S+\.\S+/
?Antworten:
Sie können es in eine Zeichenfolge konvertieren und den Ausdruck erstellen, indem Sie Folgendes aufrufen
new RegExp()
:Anmerkungen:
RegExp
akzeptiert Modifikatoren als zweiten Parameter/regex/g
=>new RegExp('regex', 'g')
[ Zusatz ES20xx (getaggte Vorlage)]
In ES20xx können Sie getaggte Vorlagen verwenden . Siehe das Snippet.
Hinweis:
\s
,\s+
,\s{1,x}
,\t
,\n
usw.).quelle
new RegExp
ist eine großartige Möglichkeit für mehrzeilige reguläre Ausdrücke. Anstatt Arrays zu verbinden, können Sie einfach einen String-Verkettungsoperator verwenden:var reg = new RegExp('^([a-' + 'z]+)$','i');
//
) nicht einfach kopieren und als Zeichenfolgenargument in den RegExp-Konstruktor einfügen können. Dies liegt daran, dass bei der Auswertung des Zeichenfolgenliterals Backslash-Zeichen verwendet werden . Beispiel:/Hey\sthere/
kann nicht ersetzt werden durchnew RegExp("Hey\sthere")
. Stattdessen sollte es durchnew RegExp("Hey\\sthere")
Hinweis auf den zusätzlichen Backslash ersetzt werden! Daher ziehe ich es vor, nur ein langes Regex-Literal in einer langen Zeile zuRegExp
auf eine Weise konstruieren, die viel einfacher zu verstehen ist.Wenn Sie die Antwort @KooiInc erweitern, können Sie vermeiden, dass jedes Sonderzeichen manuell maskiert wird, indem Sie die
source
Eigenschaft desRegExp
Objekts verwenden.Beispiel:
oder wenn Sie vermeiden möchten, die
.source
Eigenschaft zu wiederholen , können Sie dies mit der folgendenArray.map()
Funktion tun :In ES6 kann die Kartenfunktion reduziert werden auf:
.map(r => r.source)
quelle
combineRegex = (...regex) => new RegExp(regex.map(r => r.source).join(""))
Verwendung:combineRegex(/regex1/, /regex2/, ...)
Das Verwenden von Strings in
new RegExp
ist umständlich, da Sie alle Backslashes umgehen müssen. Sie können kleinere reguläre Ausdrücke schreiben und diese verketten.Lassen Sie uns diesen regulären Ausdruck aufteilen
Wir werden eine Funktion verwenden, um die Dinge später schöner zu machen
Und jetzt lass uns rocken
Versuchen Sie, die echte Regex nur einmal zu erstellen, und verwenden Sie diese dann, da dies Kosten verursacht.
quelle
Hier gibt es gute Antworten, aber der Vollständigkeit halber sollte jemand das Kernmerkmal von Javascript in Bezug auf die Vererbung mit der Prototypenkette erwähnen . So etwas veranschaulicht die Idee:
quelle
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.
Auf diese Weise können Sie jetzt reguläre Ausdrücke wie folgt schreiben:
Ausgänge
Oder was ist mit Multiline?
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 :
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?
Erfolgreich ausgegeben
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.
quelle
In der obigen Regex fehlen einige schwarze Schrägstriche, die nicht richtig funktionieren. Also habe ich den regulären Ausdruck bearbeitet. Bitte beachten Sie diesen regulären Ausdruck, der für die E-Mail-Validierung zu 99,99% funktioniert.
quelle
Um das Array zu vermeiden
join
, können Sie auch die folgende Syntax verwenden:quelle
Persönlich würde ich mich für eine weniger komplizierte Regex entscheiden:
Sicher, es ist weniger genau als Ihr aktuelles Muster, aber was versuchen Sie zu erreichen? Versuchen Sie, versehentliche Fehler zu erfassen, die Ihre Benutzer möglicherweise eingeben, oder befürchten Sie, dass Ihre Benutzer versuchen, ungültige Adressen einzugeben? Wenn es das erste ist, würde ich mich für ein einfacheres Muster entscheiden. In letzterem Fall ist eine Überprüfung durch Beantwortung einer an diese Adresse gesendeten E-Mail möglicherweise die bessere Option.
Wenn Sie jedoch Ihr aktuelles Muster verwenden möchten, ist es (IMO) einfacher zu lesen (und zu warten!), Indem Sie es aus kleineren Untermustern wie folgt erstellen:
quelle
Sie können einfach die Zeichenfolgenoperation verwenden.
quelle
Ich habe versucht, Koruns Antwort zu verbessern, indem ich alles gekapselt und Unterstützung für die Aufteilung von Erfassungsgruppen und Zeichensätzen implementiert habe - was diese Methode viel vielseitiger macht.
Um dieses Snippet zu verwenden, müssen Sie die Variadic-Funktion aufrufen,
combineRegex
deren Argumente die Objekte mit regulären Ausdrücken sind, die Sie kombinieren müssen. Die Implementierung finden Sie unten.Das Erfassen von Gruppen kann jedoch nicht direkt auf diese Weise aufgeteilt werden, da einige Teile nur eine Klammer enthalten. Ihr Browser würde mit einer Ausnahme fehlschlagen.
Stattdessen übergebe ich einfach den Inhalt der Erfassungsgruppe innerhalb eines Arrays. Die Klammern werden automatisch hinzugefügt, wenn Sie
combineRegex
auf ein Array stoßen.Außerdem müssen Quantifizierer etwas folgen. Wenn der reguläre Ausdruck aus irgendeinem Grund vor einem Quantifizierer aufgeteilt werden muss, müssen Sie ein Paar Klammern hinzufügen. Diese werden automatisch entfernt. Der Punkt ist, dass eine leere Erfassungsgruppe ziemlich nutzlos ist und Quantifizierer auf diese Weise etwas haben, auf das sie sich beziehen können. Die gleiche Methode kann für Dinge wie nicht erfassende Gruppen verwendet werden (
/(?:abc)/
wird[/()?:abc/]
).Dies lässt sich am besten anhand eines einfachen Beispiels erklären:
würde werden:
Wenn Sie Zeichensätze teilen müssen, können Sie Objekte (
{"":[regex1, regex2, ...]}
) anstelle von Arrays ([regex1, regex2, ...]
) verwenden. Der Inhalt des Schlüssels kann beliebig sein, solange das Objekt nur einen Schlüssel enthält. Beachten Sie, dass an Stelle von()
Ihnen verwenden]
als Dummy - Anfang , wenn das erste Zeichen als Quantifizierer interpretiert werden könnte. Dh/[+?]/
wird{"":[/]+?/]}
Hier ist der Ausschnitt und ein vollständigeres Beispiel:
quelle
@ Hashbrowns großartige Antwort hat mich auf den richtigen Weg gebracht. Hier ist meine Version, die ebenfalls von diesem Blog inspiriert wurde .
Verwenden Sie es so:
So erstellen Sie dieses
RegExp
Objekt:quelle