¿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.

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 ):

[,;]+

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.

[^,;]

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:

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.