Ist es möglich so etwas zu tun?
var pattern = /some regex segment/ + /* comment here */
/another segment/;
Oder muss ich eine neue RegExp()
Syntax verwenden und eine Zeichenfolge verketten? Ich würde es vorziehen, das Literal zu verwenden, da der Code sowohl selbstverständlicher als auch prägnanter ist.
javascript
regex
syntax
Augenlidlosigkeit
quelle
quelle
let regexSegment1 = String.raw`\s*hello\s*`
Antworten:
Hier erfahren Sie, wie Sie einen regulären Ausdruck erstellen, ohne die Literal-Syntax für reguläre Ausdrücke zu verwenden. Auf diese Weise können Sie eine beliebige Zeichenfolgenmanipulation durchführen, bevor sie zu einem Objekt mit regulären Ausdrücken wird:
Wenn Sie zwei Literale mit regulären Ausdrücken haben, können Sie diese mithilfe dieser Technik verketten:
Es ist nur wortreicher, als nur Ausdruck eins und zwei als wörtliche Zeichenfolgen anstelle von wörtlichen regulären Ausdrücken zu haben.
quelle
new RegExp(/(/.source + /.*/.source + /)?/.source);
scheint nicht zu funktionieren.expression_one
? Meinst duregex1
?Das zufällige Verketten von Objekten mit regulären Ausdrücken kann einige nachteilige Nebenwirkungen haben. Verwenden Sie stattdessen die RegExp.source :
Auf diese Weise können Sie auch die Flags für reguläre Ausdrücke aus einem früheren RegExp mithilfe der Standard-RegExp-Flags beibehalten.
jsFiddle
quelle
RegExp.prototype.flags
Ich bin mit der Option "eval" nicht ganz einverstanden.
gibt "// abcd // efgh //" aus, was nicht das beabsichtigte Ergebnis ist.
Mit Quelle wie
wird "/ abcdefgh /" geben und das ist richtig.
Logischerweise besteht keine Notwendigkeit zur BEWERTUNG, Sie kennen Ihren AUSDRUCK. Sie brauchen nur seine QUELLE oder wie es geschrieben ist, nicht unbedingt seinen Wert. Für die Flags müssen Sie nur das optionale Argument von RegExp verwenden.
In meiner Situation habe ich das Problem, dass ^ und $ in mehreren Ausdrücken verwendet werden, die ich miteinander verketten möchte! Diese Ausdrücke sind Grammatikfilter, die im gesamten Programm verwendet werden. Jetzt möchte ich einige von ihnen nicht zusammen verwenden, um den Fall von PRÄPOSITIONEN zu behandeln. Möglicherweise muss ich die Quellen "in Scheiben schneiden", um den Anfang und das Ende zu entfernen ^ (und / oder) $ :) Prost, Alex.
quelle
var regex = "\.\..*"
Problem Wenn der reguläre Ausdruck Back-Matching-Gruppen wie \ 1 enthält.
Dann funktioniert es nicht, nur die Quellen zu verketten. In der Tat ist die Kombination der beiden:
Die Lösung: Zuerst zählen wir die Anzahl der übereinstimmenden Gruppen im ersten regulären Ausdruck, dann erhöhen wir sie für jedes Back-Matching-Token im zweiten um die Anzahl der übereinstimmenden Gruppen.
Prüfung:
quelle
function concatenateList() { var res = arguments[0]; for(var i = 1; i < arguments.length; i++) { res = concatenate(res, arguments[i]); } return res; }
Es wäre vorzuziehen, die Literal-Syntax so oft wie möglich zu verwenden. Es ist kürzer, besser lesbar und Sie benötigen keine Escape-Anführungszeichen oder Double-Escape-Rückschläge. Aus "Javascript Patterns", Stoyan Stefanov 2010.
Die Verwendung von Neu kann jedoch die einzige Möglichkeit zur Verkettung sein.
Ich würde eval vermeiden. Es ist nicht sicher.
quelle
Vorausgesetzt, dass:
/this/g
anstattnew RegExp('this', 'g')
;Dann möchten Sie vielleicht so schreiben:
Sie können dann etwas tun wie:
In meinem speziellen Fall (einem Code-Spiegel-ähnlichen Editor) ist es viel einfacher, einen großen regulären Ausdruck auszuführen, als viele Ersetzungen wie die folgenden, da jedes Mal, wenn ich ein Ausdruck durch ein HTML-Tag ersetze, das nächste Muster verwendet wird Es ist schwieriger zu zielen, ohne das HTML-Tag selbst zu beeinflussen (und ohne das gute Aussehen , das in Javascript leider nicht unterstützt wird):
quelle
Sie könnten so etwas tun wie:
Die Segmente wären Zeichenfolgen (anstelle von Regex-Literalen), die als separate Argumente übergeben werden.
quelle
Nein, der wörtliche Weg wird nicht unterstützt. Sie müssen RegExp verwenden.
quelle
Verwenden Sie den Konstruktor mit 2 Parametern und vermeiden Sie das Problem mit dem abschließenden '/':
quelle
Sie können Regex-Quellen sowohl aus der Literal- als auch aus der RegExp-Klasse zusammenfassen:
quelle
Der einfachere Weg für mich wäre, die Quellen zu verketten, z.
Der c-Wert führt zu:
quelle
Ich bevorzuge die Verwendung,
eval('your expression')
da nicht/
an jedem Ende/
das hinzugefügt='new RegExp'
wird.quelle