615 Stimmen

Regex: Abgleich bis zum ersten Vorkommen eines Zeichens

Ich suche nach einem Muster, das zu allem passt bis das erste Vorkommen eines bestimmten Zeichens, z. B. eines ";" - ein Semikolon .

Ich habe dies geschrieben:

/^(.*);/

Aber es passt tatsächlich alles (einschließlich des Semikolons) bis zum letzten Vorkommen eines Semikolons.

112 Stimmen

/^(.*?);/ sollte auch funktionieren (es heißt nicht gierig ), aber die gegebenen Antworten mit [^;]* sind besser.

0 Stimmen

Wie würden Sie alles nach dem Semikolon und nicht das Semikolon selbst auswählen?

0 Stimmen

Siehe diese Arbeiten \w+(?!([^]+;)|;) aber dies nicht, warum? .+(?!([^]+;)|;)

788voto

sleske Punkte 77202

Sie benötigen

/^[^;]*/

El [^;] es un Charakterklasse Es passt zu allem außer einem Semikolon.

^ (Zeilenanfangsanker) wird an den Anfang der Regex angehängt, damit nur die erste Übereinstimmung in jeder Zeile erfasst wird. Dies kann erforderlich sein oder auch nicht, je nachdem, ob mögliche nachfolgende Übereinstimmungen erwünscht sind.

Zum Zitieren der perlre manpage:

Sie können eine Zeichenklasse angeben, indem Sie eine Liste von Zeichen in [] einschließen, die auf jedes Zeichen aus der Liste passt. Wenn das erste Zeichen nach "[" ein "^" ist, passt die Klasse auf jedes Zeichen, das nicht in der Liste steht.

Dies sollte in den meisten Regex-Dialekten funktionieren.

0 Stimmen

Das Tolle an dieser Lösung ist, dass sie auch mit dem Ende der Zeile übereinstimmt, z.B. hatte ich in meinem Fall foo=bar;baz=bax;bab=baf und es passte bab=baf selbst dort gibt es keine ; Das ist genau das, was ich brauche. Nicht sicher, warum es funktioniert, wenn die Spezifikation sagt, dass alles, aber das Ziel-Symbol übereinstimmt...

464voto

RJFalconer Punkte 9608

Würde;

/^(.*?);/

arbeiten?

El ? ist ein fauler Operator, so dass die Regex so wenig wie möglich erfasst, bevor sie die ; .

4 Stimmen

Ja, aber nach der Bicarbonat-Erweiterung zu Tim Toady, glaube ich, dass negierte Zeichenklassen als faule Quantifizierer gewinnen, einschließlich Backtraking. +1 sowieso.

3 Stimmen

54voto

Glenn Slaven Punkte 32691

/^[^;]*/

Das [^;] bedeutet, dass alles außer einem Semikolon übereinstimmt. Die eckigen Klammern sind ein Operator, der auf eine Menge von Zeichen zutrifft, d.h. auf jedes Zeichen in dieser Menge von Zeichen, die ^ am Anfang macht es zu einer umgekehrten Übereinstimmung, so dass alles, was mit no in diesem Set.

3 Stimmen

Beachten Sie, dass das erste ^ in dieser Antwort der Regex eine völlig andere Bedeutung gibt: Es bewirkt, dass der reguläre Ausdruck nur nach Übereinstimmungen ab dem Anfang der Zeichenkette sucht. In diesem Fall wäre das effektiv ein No-op wenn Sie führen den regulären Ausdruck nur einmal aus. Wenn Sie nach mehreren Übereinstimmungen innerhalb einer einzigen Zeichenkette suchen wollen, muss das erste ^ weg.

4 Stimmen

Er sagte, dass er alles bis zum ersten Vorkommen eines Semikolons abgleichen wollte, also nahm ich an, dass er vom Anfang der Zeichenfolge an meinte.

24voto

Lonzak Punkte 8572

Keine der vorgeschlagenen Antworten hat bei mir funktioniert. (z.B. in notepad++) Aber

^.*?(?=\;)

hat.

22voto

Dan Breslau Punkte 11294

Versuchen Sie /[^;]*/

グーグル regex character classes für Einzelheiten.

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