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.