Quale regex corrisponderà a tutti i caratteri tranne la virgola ',' o punto e virgola ';'?


345

È possibile definire una regex che corrisponderà a tutti i caratteri tranne un determinato carattere definito o insieme di caratteri?

Fondamentalmente, volevo dividere una stringa per virgola (,) o punto e virgola (;). Quindi stavo pensando di farlo con una regex che corrisponderebbe a tutto fino a quando non incontrasse una virgola o un punto e virgola.

Risposte:


474
[^,;]+         

Non hai specificato l'implementazione di regex che stai utilizzando. La maggior parte di loro ha un Splitmetodo che prende i delimitatori e li divide. Potresti voler usare quello con una ^classe di caratteri "normale" (senza ):

[,;]+

10
E la domanda non specifica se sono consentiti separatori adiacenti, quindi il '+' finale è leggermente dubbio.
Jonathan Leffler,

Ottenere un errore solo per il punto e virgola - regexp non terminato incontra la fine del file
Jaswinder il

Avevo un requisito simile dove volevo evitare il punto e virgola e la virgola alla fine ho provato molto ma nessun successo sotto è il Regex che sto usando 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; Bene convalida se uso, e; nel mezzo ma alla fine non riesce a vliadate.
Harry,

87

Usa le classi di caratteri. Una classe di caratteri che inizia con il punto di inserimento corrisponde a tutto ciò che non appartiene alla classe.

[^,;]


Avevo un requisito simile dove volevo evitare il punto e virgola e la virgola alla fine ho provato molto ma nessun successo sotto è il Regex che sto usando 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; Bene convalida se uso, e; nel mezzo ma alla fine non riesce a vliadate.
Harry,


2

Usa questo:

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

5
Ciò richiede la virgola o il punto e virgola come delimitatore di campo anziché come separatore di campo. La differenza conta alla fine di una 'linea' (o altra struttura di record scansionata); in genere, non si desidera insistere su una virgola o punto e virgola dopo l'ultimo campo. Se il tuo motore regex è abbastanza potente, puoi usare ' (?:([^,;]*)(?:[^,;]|$))' (PCRE con parentesi non catturanti). Le alternative di una virgola o punto e virgola dopo il campo o la fine della registrazione rendono le cose migliori. Valuta anche se sono consentiti campi vuoti.
Jonathan Leffler,

1
Infine, devi preoccuparti di ciò che viene effettivamente restituito dalle acquisizioni: volevi davvero includere i separatori e se ci sono 10 campi su una linea, quanti di loro vengono restituiti dalla notazione di acquisizione.
Jonathan Leffler,

1
Hai ragione su tutto ciò, ma il motivo per cui non ho concordato quelle cose nella mia risposta è che non so quale lingua / libreria di RegEx sta chiedendo l'interrogante. Potrebbe usare "GREP". Ad ogni modo, apprezzo che tu abbia aggiunto quei commenti per chiarire le cose per lui. : D
NawaMan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.