Qual regex corresponderá a todos os caracteres, exceto vírgula ',' ou ponto e vírgula ';'?

343

É possível definir um regex que corresponda a todos os caracteres, exceto um determinado caractere definido ou conjunto de caracteres?

Basicamente, eu queria dividir uma string por vírgula (,) ou ponto e vírgula (;). Então, eu estava pensando em fazê-lo com um regex que corresponderia a tudo até encontrar uma vírgula ou ponto-e-vírgula.

Kshitij Saxena -KJ-
fonte

Respostas:

472
[^,;]+         

Você não especificou a implementação de regex que está usando. A maioria deles possui um Splitmétodo que utiliza delimitadores e é dividido por eles. Você pode querer usar aquele com uma ^classe de caractere "normal" (sem ):

[,;]+
Mehrdad Afshari
fonte
10
E a pergunta não especifica se separadores adjacentes são permitidos; portanto, o '+' à direita é um pouco dúbio.
11139 Jonathan Leffler
Obtendo um erro apenas para ponto-e-vírgula - o regexp não terminado atende ao final do arquivo
Jaswinder
Eu tinha um requisito semelhante, onde eu queria evitar ponto e vírgula e vírgula no final. Tentei muito, mas sem sucesso abaixo é o Regex. Estou 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; Bem, valida se eu usar, e; no meio, mas falha no final para vliadate.
Harry
86

Use classes de caracteres. Uma classe de personagem que começa com sinal de intercalação corresponde a qualquer coisa que não esteja na classe.

[^,;]
Thom Smith
fonte
Eu tinha um requisito semelhante, onde eu queria evitar ponto e vírgula e vírgula no final. Tentei muito, mas sem sucesso abaixo é o Regex. Estou 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; Bem, valida se eu usar, e; no meio, mas falha no final para vliadate.
Harry
2

Usa isto:

([^,;]*[,;])*
NawaMan
fonte
5
Isso requer a vírgula ou ponto-e-vírgula como delimitador de campo, e não como separador de campo. A diferença importa no final de uma 'linha' (ou outra estrutura de registro digitalizada); normalmente, você não deseja insistir em vírgula ou ponto-e-vírgula após o último campo. Se o seu mecanismo de expressão regular for poderoso o suficiente, você poderá usar ' (?:([^,;]*)(?:[^,;]|$))' (PCRE com parênteses que não capturam). As alternativas de vírgula ou ponto-e-vírgula após o campo, ou fim do registro, fazem as coisas funcionarem melhor. Considere também se os campos vazios são permitidos.
11139 Jonathan Leffler
11
Finalmente, você precisa se preocupar com o que é realmente retornado pelas capturas - você realmente queria que os separadores fossem incluídos e, se houver 10 campos em uma linha, quantos deles serão retornados pela notação de captura.
11139 Jonathan Leffler
11
Você está certo sobre tudo isso, mas a razão pela qual não concordei com isso na minha resposta é que não sei qual idioma / biblioteca do RegEx o questionador está perguntando. Ele pode estar usando "GREP". De qualquer forma, agradeço por você adicionar esses comentários para esclarecer as coisas para ele. : D
NawaMan 11/09/09