Was bedeutet der Fehler „Nichts zu wiederholen“ bei der Verwendung eines regulären Ausdrucks in Javascript?

Lesezeit: 5 Minuten

Benutzeravatar von esqew
esqew

Ich bin neu bei Regex und versuche, es in eines meiner neuen Projekte zu integrieren, um zu sehen, ob ich es lernen und zu meinem Repertoire an Fähigkeiten hinzufügen kann. Allerdings stoße ich hier auf eine Hürde.

Ich versuche herauszufinden, ob die Eingabe des Benutzers illegale Zeichen enthält, indem ich die verwende .search Funktion wie folgt:

if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) {
    ...
}

Wenn ich jedoch versuche, die Funktion auszuführen, in der diese Zeile enthalten ist, wird für diese bestimmte Zeile der folgende Fehler ausgegeben:

Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}\()@.

]/: Nothing to repeat

Ich kann beim besten Willen nicht sehen, was mit meinem Code nicht stimmt. Kann mir jemand die richtige Richtung weisen?

  • Mein Code warf nur SyntaxError: nothing to repeat ohne Angabe, wo das Problem lag. Durch diese Frage wurde mir klar, dass es sich um Regex handelte, und ich hatte gerade eine hinzugefügt '*' Regex und jetzt ergab alles einen Sinn.

    – Akaisteph7

    16. Februar um 17:55 Uhr

andrewdskis Benutzeravatar
andrewdski

Sie müssen die Backslashes verdoppeln, die als Escapezeichen für die Sonderzeichen des regulären Ausdrucks verwendet werden. Wie @Bohemian jedoch betont, sind die meisten dieser Backslashes nicht erforderlich. Leider leidet seine Antwort unter dem gleichen Problem wie Ihre. Was Sie eigentlich wollen, ist:

Der Backslash wird vom Code interpretiert, der die Zeichenfolge liest, und nicht an den Parser für reguläre Ausdrücke übergeben. Sie wollen:

"[\\[\\]?*+|{}\\\\()@.\n\r]"

Beachten Sie den vierfachen Backslash. Das ist auf jeden Fall nötig. Die an den Compiler für reguläre Ausdrücke übergebene Zeichenfolge ist dann identisch mit der Zeichenfolge von @Bohemian und funktioniert ordnungsgemäß.

  • Übrigens wird das Vierfache \ nur in einigen Sprachen benötigt; zB Java ja, Perl nicht

    – Böhmisch

    9. Juni 2011 um 22:13

  • Ein ähnlich erlebter Duh-Moment, den ich auch erlebt habe. Bitte beachten Sie, dass der Backslash zuerst von der Sprachsyntax und dann vom RegExp interpretiert wird.

    – enorl76

    30. Juli 2018 um 19:51 Uhr

  • Ich möchte nur erwähnen, dass einige Erklärungen für die Javascript-Str.search-Methode so aussehen, als ob die Zeichenfolge zwischen Anführungszeichen eine reine Zeichenfolge ist, z. B. str.search(“hello”), sodass jemand denken könnte, dass die korrekte Syntax str wäre, wenn die Wunschzeichenfolge nur z. B. ein Sternchen wäre .search(“*”), was zum gleichen Fehler „Nichts zu wiederholen“ führte. Richtig ist str.search(“\*”)

    – Portal TheAnGeLs

    29. Juli 2021 um 12:54

Benutzeravatar von NobodyMan
NiemandMann

Aufbauend auf @Bohemian denke ich, dass der einfachste Ansatz darin besteht, einfach ein Regex-Literal zu verwenden, z. B.:

if (name.search(/[\[\]?*+|{}\\()@.\n\r]/) != -1) {
    // ... stuff ...
}

Regex-Literale sind praktisch, weil Sie das Escape-Zeichen nicht maskieren müssen und einige IDEs ungültige Regex hervorheben (sehr hilfreich für mich, da ich sie ständig vermassle).

Benutzer-Avatar von Tomáš Hübelbauer
Tomáš Hübelbauer

Für Google-Reisende: Diese dummerweise nicht hilfreiche Fehlermeldung wird auch angezeigt, wenn Sie einen Tippfehler machen und den Betrag verdoppeln + Regex-Operator:

Okay:

\w+

Nicht Okay:

\w++

  • Jede Kombination von + Und * Chatacter eigentlich.

    – Sharcoux

    17. März 2021 um 14:25

  • Du hast meinen Code gespeichert 🤣. Ich hatte einen Tippfehler /(*\s*)/. Ja, sehr wenig hilfreiche Nachricht

    – Tomáš Wróbel

    5. September 2021 um 8:04

  • @Sharcoux – ja! Ich wollte a ersetzen + mit einem * aber am Ende hatte ich beides. Danke schön!

    – Katie Byers

    9. August 2022 um 2:12

Bohemians Benutzeravatar
Bohemien

Erstens in einer Charakterklasse [...] am meisten Zeichen müssen nicht maskiert werden – es handelt sich lediglich um Literale.

Ihr regulärer Ausdruck sollte also sein:

"[\[\]?*+|{}\\()@.\n\r]"

Das wird für mich kompiliert.

Benutzeravatar von Aneeq Ahmad
Aneeq Ahmad

Nun, in meinem Fall musste ich eine Telefonnummer mit Hilfe von Regex testen und bekam die gleiche Fehlermeldung:

Invalid regular expression: /+923[0-9]{2}-(?!1234567)(?!1111111)(?!7654321)[0-9]{7}/: Nothing to repeat'

Was also in meinem Fall der Fehler war, war dieser + Operator nach dem / am Anfang der Regex. So umschließen die + Operator mit eckigen Klammern [+]und erneutes Senden der Anfrage, funktionierte wie ein Zauber.

Folgendes wird funktionieren:

/[+]923[0-9]{2}-(?!1234567)(?!1111111)(?!7654321)[0-9]{7}/

Diese Antwort kann für diejenigen hilfreich sein, die die gleiche Art von Fehler hatten, aber aus dieser Sicht sind die Chancen, den Fehler zu bekommen, höher als bei mir! Beifall 🙂

  • Warum haben Sie das Pluszeichen nicht einfach maskiert, anstatt es vollständig zu verschieben …? (\+)

    – esqew

    18. Okt. 2020 um 14:28


  • Vielen Dank, dass du mich @esqew verstehen lässt, noch eine andere, aber ich habe eine andere Lösung 🙂

    – Aneeq Ahmad

    19. Okt. 2020 um 15:44

Abrahams Benutzeravatar
Abraham

Ich bin zum Beispiel in express node.js darauf gestoßen, als ich versucht habe, eine Route für Pfade zu erstellen, die nicht mit beginnen /internal

app.get(`\/(?!internal).*`, (req, res)=>{

und nach langem Ausprobieren funktionierte es einfach, als ich es als RegExp-Objekt übergab new RegExp()

app.get(new RegExp("\/(?!internal).*"), (req, res)=>{

Dies kann hilfreich sein, wenn dieses häufige Problem beim Routing auftritt

  • Warum haben Sie das Pluszeichen nicht einfach maskiert, anstatt es vollständig zu verschieben …? (\+)

    – esqew

    18. Okt. 2020 um 14:28


  • Vielen Dank, dass du mich @esqew verstehen lässt, noch eine andere, aber ich habe eine andere Lösung 🙂

    – Aneeq Ahmad

    19. Okt. 2020 um 15:44

Dies kann auch passieren, wenn Sie einen regulären Ausdruck mit beginnen ?.

? kann als Quantor fungieren – also ? kann erwarten, dass etwas anderes davor kommt, daher der Fehler „Nichts zu wiederholen“. In der Regex-Zeichenfolge stand nichts davor, sodass nichts quantifiziert werden konnte. Es gab nichts zu wiederholen / nichts zu quantifizieren.

? hat auch eine andere Rolle – wenn die ? geht voran ( es kann den Beginn einer Lookaround-Assertion oder eines anderen speziellen Konstrukts anzeigen. Siehe Beispiel unten.

Wenn man vergisst, das zu schreiben () Klammern um die folgende Lookbehind-Behauptung ?<=xdies wird den Fehler des OP verursachen:

Falsch: const xThenFive = /?<=x5/;

Richtig:
const xThenFive = /(?<=x)5/;

Das /(?<=x)5/ ist ein positiver Lookbehind: Wir suchen nach einer 5, der ein vorangestellt ist x zB würde es mit dem übereinstimmen 5 In x563 aber nicht das 5 In x652.

1454270cookie-checkWas bedeutet der Fehler „Nichts zu wiederholen“ bei der Verwendung eines regulären Ausdrucks in Javascript?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy