¿Qué expresión regular coincidirá con todos los caracteres excepto la coma ',' o punto y coma ';'?

344

¿Es posible definir una expresión regular que coincida con todos los caracteres excepto un determinado carácter definido o conjunto de caracteres?

Básicamente, quería dividir una cadena por coma (,) o punto y coma (;). Así que estaba pensando en hacerlo con una expresión regular que coincidiría con todo hasta que encuentre una coma o un punto y coma.

Kshitij Saxena -KJ-
fuente

Respuestas:

472
[^,;]+         

No ha especificado la implementación de expresiones regulares que está utilizando. La mayoría de ellos tienen un Splitmétodo que toma delimitadores y se divide por ellos. Es posible que desee utilizar ese con una ^clase de caracteres "normal" (sin ):

[,;]+
Mehrdad Afshari
fuente
10
Y la pregunta no especifica si se permiten separadores adyacentes, por lo que el '+' final es un poco dudoso.
Jonathan Leffler
Obteniendo un error solo para punto y coma - expresión regular sin terminar se encuentra con el final del archivo
Jaswinder
Tuve un requisito similar donde quiero evitar el punto y coma y la coma al final. Intenté mucho, pero no tengo éxito a continuación. Regex Estoy 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; Bueno, valida si uso, y; en el medio, pero al final no se puede actualizar.
Harry
86

Usa clases de personajes. Una clase de personaje que comience con intercalar coincidirá con cualquier cosa que no esté en la clase.

[^,;]
Thom Smith
fuente
2
Más información sobre las clases de caracteres negados
HEX
Tuve un requisito similar donde quiero evitar el punto y coma y la coma al final. Intenté mucho, pero no tengo éxito a continuación. Regex Estoy 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; Bueno, valida si uso, y; en el medio, pero al final no se puede actualizar.
Harry
2

Utilizar este:

([^,;]*[,;])*
NawaMan
fuente
55
Eso requiere la coma o punto y coma como delimitador de campo, en lugar de como un separador de campo. La diferencia es importante al final de una 'línea' (u otra estructura de registro escaneada); normalmente, no desea insistir en una coma o punto y coma después del último campo. Si su motor regex es lo suficientemente potente, puede usar ' (?:([^,;]*)(?:[^,;]|$))' (PCRE con paréntesis sin captura). Las alternativas de una coma o punto y coma después del campo, o al final del registro, hacen que las cosas funcionen mejor. Considere también si se permiten campos vacíos.
Jonathan Leffler
1
Finalmente, debe preocuparse por lo que realmente devuelven las capturas: si realmente desea que se incluyan los separadores, y si hay 10 campos en una línea, cuántos de ellos son devueltos por la notación de captura.
Jonathan Leffler
1
Tiene razón sobre todo eso, pero la razón por la que no puse esas cosas en mi respuesta es que no sé qué idioma / biblioteca de RegEx pregunta el interlocutor. Él puede estar usando "GREP". De todos modos, agradezco que hayas agregado esos comentarios para aclararle las cosas. : D
NawaMan