Passen Sie in Regex entweder das Ende der Zeichenfolge oder ein bestimmtes Zeichen an
Ich habe einen string. Das Ende ist anders, wie index.php?test=1&list=UL
oder index.php?list=UL&more=1
. Die eine Sache, die ich Suche, ist &list=
.
Wie kann ich es zuordnen, ob es in der Mitte der Zeichenfolge oder am Ende? Bisher habe ich [&|\?]list=.*?([&|$])
aber die ([&|$])
Teil tatsächlich nicht arbeiten; ich bin versucht, Sie entsprechen entweder &
oder das Ende der Zeichenfolge, aber am Ende der Zeichenfolge Teil nicht funktioniert, so dass dieses Muster entspricht dem zweiten Beispiel aber nicht der erste.
InformationsquelleAutor der Frage Gary | 2012-08-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden:
Beachten Sie, dass, wenn Sie einen Klammer-Ausdruck, jedes Zeichen in es (mit einige Ausnahmen) wird wörtlich interpretiert werden. In anderen Worten,
[&|$]
entspricht der Zeichen&
|
und$
.InformationsquelleAutor der Antwort João Silva
Kurz
Alle zero-width assertions innerhalb
[...]
verlieren, es bedeutet ein null-Breite assertion.[\b]
nicht mit einer Wortgrenze (es entspricht der Rücktaste, oder, in POSIX,\
oderb
),[$]
entspricht einem literal$
char[^]
ist entweder ein Fehler oder, wie in ECMAScript regex Geschmack, jeden char. Gleiche mit\z
\Z
\A
Anker.Können Sie lösen das problem mithilfe einer der folgenden Muster:
Matching zwischen einem char-Sequenz und eine einzelne char oder Ende der Zeichenfolge (aktuelle Szenario)
Den
.*?([YOUR_SINGLE_CHAR_DELIMITER(S)]|$)
Muster (vorgeschlagen von João Silva) ist eher ineffizient, da die regex-engine-Prüfungen für die Muster, die erscheinen, um das Recht der faulen dot-Muster der ersten, und nur dann, wenn Sie nicht übereinstimmen tut es "erweitern" die faulen dot-Muster.In diesen Fällen ist es empfohlen, zu verwenden negierte Zeichenklasse (oder klammerausdruck in der POSIX-talk):
Siehe demo. Details
[&?]
- eine positive Charakter-Klasse passt entweder&
oder?
(beachten Sie die Beziehungen zwischen chars/den char Bereiche in einer Charakter-Klasse sind ODER Beziehungen)list=
- substring -, char-Sequenz([^&]*)
- Capturing-Gruppe #1: null oder mehr (*
) chars andere als&
([^&]
), so viele wie möglichÜberprüfung der für die nachfolgende einzigen char Trennzeichen Präsenz, ohne es wieder oder Ende der Zeichenkette
Meisten regex-Varianten (einschließlich der JavaScript-beginnend mit ECMAScript-2018) Unterstützung lookarounds, Konstrukte, die nur true oder false zurück, ob es Muster übereinstimmen oder nicht. Sie sind entscheidend im Falle Spiele in Folge, kann beginnen und enden mit dem gleichen char zu erwarten sind (siehe das ursprüngliche Muster, kann es mit einer Zeichenfolge überein beginnend und endend mit
&
). Es ist zwar nicht zu erwarten, in einem query-string, es ist ein häufiges Szenario.In diesem Fall, können Sie zwei Ansätze:
(?=[SINGLE_CHAR_DELIMITER(S)]|$)
(?![^SINGLE_CHAR_DELIMITER(S)])
Dem negativen lookahead-Lösung ist ein wenig effizienter, da Sie nicht mit einem Wechsel der Gruppe, fügt hinzu, die Komplexität matching-Verfahren. Die OP-Lösung Aussehen würde
oder
Sehen dieser regex demo und ein weiterer hier.
Sicherlich, im Falle der nachgestellte Trennzeichen sind multichar-Sequenzen, nur der eine positive lookahead-Lösung funktioniert seit
[^yes]
nicht negieren eine Sequenz von Zeichen, aber die chars innerhalb der Klasse (d.h.[^yes]
passt zu jedem char, abery
e
unds
).InformationsquelleAutor der Antwort Wiktor Stribiżew