Welche Regex passt zu jedem Zeichen außer Komma ',' oder Semikolon ';'?

343

Ist es möglich, einen regulären Ausdruck zu definieren, der mit jedem Zeichen außer einem bestimmten definierten Zeichen oder Zeichensatz übereinstimmt?

Grundsätzlich wollte ich eine Zeichenfolge entweder durch Komma (,) oder Semikolon (;) teilen. Also dachte ich daran, es mit einem regulären Ausdruck zu machen, der zu allem passt, bis er auf ein Komma oder ein Semikolon stößt.

Kshitij Saxena -KJ-
quelle

Antworten:

471
[^,;]+         

Sie haben die von Ihnen verwendete Regex-Implementierung nicht angegeben. Die meisten von ihnen haben eine SplitMethode, die Trennzeichen verwendet und von ihnen aufgeteilt wird. Vielleicht möchten Sie diese mit einer "normalen" (ohne ^) Zeichenklasse verwenden:

[,;]+
Mehrdad Afshari
quelle
10
Und die Frage gibt nicht an, ob benachbarte Trennzeichen zulässig sind, daher ist das nachfolgende '+' etwas zweifelhaft.
Jonathan Leffler
Fehler nur für Semikolon erhalten - nicht abgeschlossener regulärer Ausdruck trifft Dateiende
Jaswinder
Ich hatte eine ähnliche Anforderung, bei der ich Semikolon und Komma am Ende vermeiden möchte. Ich habe viel versucht, aber kein Erfolg unten ist der Regex, den ich verwende. Const regexDomain = / ^ (?: [A-Za-z0-9] (?: [A-Za-z0-9 -] {0,61} [A-Za-z0-9])? \.) + [A-Za-z0-9] [A-Za-z0-9 -] { 0,61} [A-Za-z0-9] / g; Nun, es bestätigt, ob ich benutze, und; dazwischen aber scheitert am Ende zu vliadieren.
Harry
86

Verwenden Sie Zeichenklassen. Eine Charakterklasse, die mit caret beginnt, entspricht allem, was nicht in der Klasse enthalten ist.

[^,;]
Thom Smith
quelle
2
Mehr über negierte Charakterklassen
HEX
Ich hatte eine ähnliche Anforderung, bei der ich Semikolon und Komma am Ende vermeiden möchte. Ich habe viel versucht, aber kein Erfolg unten ist der Regex, den ich verwende. Const regexDomain = / ^ (?: [A-Za-z0-9] (?: [A-Za-z0-9 -] {0,61} [A-Za-z0-9])? \.) + [A-Za-z0-9] [A-Za-z0-9 -] { 0,61} [A-Za-z0-9] / g; Nun, es bestätigt, ob ich benutze, und; dazwischen aber scheitert am Ende zu vliadieren.
Harry
2

Benutze das:

([^,;]*[,;])*
NawaMan
quelle
5
Dies erfordert das Komma oder Semikolon als Feldtrennzeichen und nicht als Feldtrennzeichen. Der Unterschied ist am Ende einer 'Zeile' (oder einer anderen gescannten Datensatzstruktur) von Bedeutung. Normalerweise möchten Sie nach dem letzten Feld nicht auf einem Komma oder Semikolon bestehen. Wenn Ihre Regex-Engine leistungsfähig genug ist, können Sie ' (?:([^,;]*)(?:[^,;]|$))' (PCRE mit nicht erfassenden Klammern) verwenden. Die Alternativen eines Kommas oder Semikolons nach dem Feld oder dem Ende der Aufzeichnung sorgen dafür, dass die Dinge besser funktionieren. Überlegen Sie auch, ob leere Felder zulässig sind.
Jonathan Leffler
1
Schließlich müssen Sie sich Gedanken darüber machen, was von den Captures tatsächlich zurückgegeben wird. Wollten Sie wirklich, dass die Trennzeichen enthalten sind, und wenn sich 10 Felder in einer Zeile befinden, wie viele davon werden von der Capture-Notation zurückgegeben?
Jonathan Leffler
1
Sie haben in all dem Recht, aber der Grund, warum ich diese Sache in meiner Antwort nicht konzertiert habe, ist, dass ich nicht weiß, welche Sprache / Bibliothek von RegEx der Fragesteller fragt. Möglicherweise verwendet er "GREP". Wie auch immer, ich weiß es zu schätzen, dass Sie diese Kommentare hinzugefügt haben, um die Dinge für ihn zu klären. : D
NawaMan