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.

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

[,;]+

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.

[^,;]


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:

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.