198 Stimmen

Wie kann ich Regex-Literale in JavaScript verketten?

Ist es möglich, so etwas zu tun?

var pattern = /some regex segment/ + /* comment here */
    /another segment/;

Oder muss ich neue RegExp() Syntax und Verkettung einer Zeichenkette? Ich würde es vorziehen, das Literal zu verwenden, da der Code sowohl selbsterklärend als auch prägnant ist.

3 Stimmen

Es ist einfacher, mit escapeten Regex-Zeichen umzugehen, wenn Sie String.raw() verwenden: let regexSegment1 = String.raw`\s*hello\s*`

5voto

Jeff Lowery Punkte 2223

Sie können Regex-Quellen sowohl aus der Literal- als auch aus der RegExp-Klasse zusammenfügen:

var xxx = new RegExp(/abcd/);
var zzz = new RegExp(xxx.source + /efgh/.source);

4voto

Jonathan Wright Punkte 39

Es wäre vorzuziehen, so oft wie möglich die wörtliche Syntax zu verwenden. Sie ist kürzer, besser lesbar, und Sie brauchen keine Escape-Zeichen oder doppelte Escape-Backlashes. Aus "Javascript Patterns", Stoyan Stefanov 2010.

Die Verwendung von New ist jedoch möglicherweise die einzige Möglichkeit der Verkettung.

Ich würde eval vermeiden. Es ist nicht sicher.

1 Stimmen

Ich denke, dass komplexe reguläre Ausdrücke besser lesbar sind, wenn sie wie in der Frage aufgeteilt und kommentiert werden.

4voto

Neil Strain Punkte 556

Sie könnten etwas wie folgt tun:

function concatRegex(...segments) {
  return new RegExp(segments.join(''));
}

Die Segmente wären Zeichenketten (und nicht Regex-Literale), die als separate Argumente übergeben werden.

2voto

ph7 Punkte 112

Verwenden Sie den Konstruktor mit 2 Parametern und vermeiden Sie das Problem mit dem nachgestellten '/':

var re_final = new RegExp("\\" + ".", "g");    // constructor can have 2 params!
console.log("...finally".replace(re_final, "!") + "\n" + re_final + 
    " works as expected...");                  // !!!finally works as expected

                         // meanwhile

re_final = new RegExp("\\" + "." + "g");              // appends final '/'
console.log("... finally".replace(re_final, "!"));    // ...finally
console.log(re_final, "does not work!");              // does not work

2voto

Daniel Aragão Punkte 116

Der einfachere Weg wäre für mich die Verkettung der Quellen, z. B.:

a = /\d+/
b = /\w+/
c = new RegExp(a.source + b.source)

wird der c-Wert ergeben:

/ \d + \w +/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X