Was bedeutet der Fehler „Nichts zu wiederholen“ bei der Verwendung eines regulären Ausdrucks in Javascript?
Lesezeit: 5 Minuten
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
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
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).
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
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.
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.
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
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()
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.
14542700cookie-checkWas bedeutet der Fehler „Nichts zu wiederholen“ bei der Verwendung eines regulären Ausdrucks in Javascript?yes
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