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.

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:

[,;]+

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.

[^,;]

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:

([^,;]*[,;])*

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.