Jakie wyrażenie będzie pasować do każdej postaci oprócz przecinka, średnika lub średnika;

344

Czy można zdefiniować wyrażenie regularne, które będzie pasować do każdego znaku oprócz określonego znaku lub zestawu znaków?

Zasadniczo chciałem podzielić ciąg przez przecinek (,) lub średnik (;). Tak więc myślałem o zrobieniu tego z wyrażeniem regularnym, które pasowałoby do wszystkiego, dopóki nie napotka przecinka lub średnika.

Kshitij Saxena -KJ-
źródło

Odpowiedzi:

473
[^,;]+         

Nie określono używanej implementacji wyrażenia regularnego. Większość z nich ma Splitmetodę, która pobiera separatory i dzieli je według nich. Możesz użyć tej z „normalną” (bez ^) klasą znaków:

[,;]+
Mehrdad Afshari
źródło
10
Pytanie nie określa, czy dozwolone są sąsiednie separatory, więc końcowe „+” jest nieco wątpliwe.
Jonathan Leffler,
Uzyskiwanie błędu tylko dla średnika
nieokreślone wyrażenie regularne
Miałem podobny wymóg, w którym chcę uniknąć średnika i przecinka na końcu Próbowałem dużo, ale poniżej nie powiodło się to Regex Używam 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; Dobrze sprawdza się, jeśli używam, i; w międzyczasie, ale nie kończy się na vliadate.
Harry,
86

Używaj klas postaci. Klasa postaci rozpoczynająca się od karetki pasuje do wszystkiego, co nie należy do tej klasy.

[^,;]
Thom Smith
źródło
2
Więcej informacji o negowanych klasach postaci
HEX,
Miałem podobny wymóg, w którym chcę uniknąć średnika i przecinka na końcu Próbowałem dużo, ale poniżej nie powiodło się to Regex Używam 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; Dobrze sprawdza się, jeśli używam, i; w międzyczasie, ale nie kończy się na vliadate.
Harry,
2

Użyj tego:

([^,;]*[,;])*
NawaMan
źródło
5
Wymaga to przecinka lub średnika jako separatora pola, a nie jako separatora pól. Różnica ma znaczenie na końcu „linii” (lub innej zeskanowanej struktury zapisu); zazwyczaj nie chcesz nalegać na przecinek lub średnik po ostatnim polu. Jeśli silnik wyrażeń regularnych jest wystarczająco wydajny, możesz użyć „ (?:([^,;]*)(?:[^,;]|$))” (PCRE z nawiasami nie przechwytującymi). Alternatywy przecinka lub średnika po polu lub końcu zapisu sprawiają, że wszystko działa lepiej. Zastanów się również, czy puste pola są dozwolone.
Jonathan Leffler,
1
Na koniec musisz się martwić o to, co faktycznie jest zwracane przez przechwytywanie - czy naprawdę chciałeś, aby uwzględniono separatory, a jeśli w linii jest 10 pól, ile z nich jest zwracanych przez notację przechwytywania.
Jonathan Leffler,
1
Masz rację w tym wszystkim, ale powodem, dla którego nie zgodziłem się na to w mojej odpowiedzi, jest to, że nie wiem, jakiego języka / biblioteki RegEx pyta pytający. Może używa „GREP”. W każdym razie doceniam to, że dodajesz te komentarze, aby wyjaśnić mu sytuację. : D
NawaMan,