Nehmen Sie diesen regulären Ausdruck: /^[^abc]/
. Dieser Ausdruck passt auf jedes einzelne Zeichen am Anfang einer Zeichenkette, außer a, b oder c.
Wenn Sie danach ein *
hinzufügen - /^[^abc]*/
- wird der reguläre Ausdruck weiterhin jedes nachfolgende Zeichen zum Ergebnis hinzufügen, bis er entweder auf ein a
, oder b
, oder c
trifft.
Bei der Quellzeichenkette "qwerty qwerty whatever abc hello"
zum Beispiel wird der Ausdruck bis zu "qwerty qwerty wh"
passen.
Aber was wäre, wenn ich wollte, dass die übereinstimmende Zeichenkette "qwerty qwerty whatever "
ist?
...Mit anderen Worten, wie kann ich alles bis zu (aber nicht einschließlich) der exakten Sequenz "abc"
finden?
Wenn Sie alles bis zu "abc" erfassen wollen:
/^(.*?)abc/
Erläuterung:
( )
erfasst den Ausdruck innerhalb der Klammern für den Zugriff mit $1
, $2
, etc.
^
entspricht dem Anfang der Zeile
.*
passt auf alles, ?
nicht auf alles (die Mindestanzahl von Zeichen muss passen) - [1]
[1] Der Grund, warum dies erforderlich ist, ist, dass sonst in der folgenden Zeichenfolge:
whatever whatever something abc something abc
Standardmäßig sind Regexe gierig, was bedeutet, dass sie so viel wie möglich übereinstimmen werden. Daher würde /^.*abc/
auf "was auch immer was auch immer etwas abc etwas " passen. Durch Hinzufügen des Non-greedy-Quantifizierers ?
passt der Regex nur auf "whatever whatever something ".
Ich glaube, Sie brauchen Unterausdrücke. Wenn ich mich richtig erinnere, können Sie die normalen ()
-Klammern für Unterausdrücke verwenden.
Dieser Teil ist aus dem grep-Handbuch:
Back References and Subexpressions
The back-reference \n, where n is a single digit, matches the substring
previously matched by the nth parenthesized subexpression of the
regular expression.
Tun Sie etwas wie ^[^(abc)]
sollte den Trick tun.
Das $
markiert das Ende einer Zeichenkette, so dass etwas wie dies funktionieren sollte: [[^abc]*]$
, wobei Sie nach etwas suchen, das NICHT in irgendeiner Iteration von abc
endet, aber es müsste am Ende stehen
Wenn Sie eine Skriptsprache mit Regex verwenden (z. B. php oder js), haben diese eine Suchfunktion, die anhält, wenn sie zum ersten Mal auf ein Muster stößt (und Sie können angeben, ob Sie von links oder von rechts beginnen wollen, oder bei php können Sie eine Implosion durchführen, um die Zeichenkette zu spiegeln).