Pergunta

Pergunta fácil desta vez.

Estou tentando testar se uma string não contém ou não um caractere usando expressões regulares. Eu pensei que a expressão era da forma [^x] Onde x é o personagem que você não quer aparecer, mas isso não parece estar funcionando.

Por exemplo,

Regex.IsMatch("103","[^0]")

e

Regex.IsMatch("103&","[^&]")

Ambos retornam verdadeiro (eu esperaria falso).

Comecei a usar "[^&]" e pensei que talvez o e precisasse ser escapado como &, mas não parecia fazer a diferença.

Ideias? Presumo que seja algo pequeno.

Além disso, estou usando .NET, então lembre -se disso.

Edit1:

eu encontrei isto, mas parece não responder ao problema que estou tendo.

Edit2:

Eu queria responder a Kevin e Joelsugestões. Essas sugestões seriam realmente mais rápidas, mas elas não atendem à flexibilidade de que preciso neste caso; portanto, se você encontrou essa pergunta através da pesquisa, definitivamente veja se as respostas deles atenderão às suas necessidades. No meu caso, a expressão regular está sendo passada para um método de validação de dados que atravessa cada linha e verifica que o conteúdo dessa linha em uma coluna específico corresponde à regex que está sendo passada. Como estarei reutilizando esse método Para vários outros dados que estão sendo validados, eu queria:

  1. Use Regex para permitir a mais ampla gama de validações e
  2. Sempre procure uma correspondência positiva (ou seja, em vez de usar! Regex.ispatch (célula, regexvariable), eu queria confiar sempre em poder usar o regex.ispatch (célula, regexvariable), pois a maioria dos dados que invocam esse método estarão usando a correspondência positiva em vez do negativo.

Espero que isso ajude.

Foi útil?

Solução

Sua solução está meio certa. A partida que você vê é para os outros personagens. O que você quer dizer é algo como "Ei! Eu não quero ver esse personagem em toda a string".

Nesse caso, você faz:

Regex.IsMatch("103","^[^0]*$")

Outras dicas

O padrão [^0] corresponderá a qualquer caractere que não seja zero. Nos dois exemplos, o padrão corresponderá ao primeiro caractere ("1"). Para testar se a sequência inteira não contém zeros, o padrão deve ser "^[^0]*$". Isso diz o seguinte: Inicie no início da string, corresponda a um número arbitrário de caracteres que não são zeros, seguidos imediatamente pelo final da string. Qualquer string que contém um zero falhará. Qualquer string que não contém zeros passará.

Se você está procurando um único caractere em uma string, Regex parece um exagero. Por que não usar apenas .IndexOf ou .Contains?

O primeiro caractere que o analisador chega é "1", que é verdadeiro para [^0] e também verdadeiro para [^&], portanto, ele retornará verdadeiro em ambos os exemplos.

Você está colocando sua negação no lugar errado. [^x] Combinará qualquer coisa que não seja x. Se x estiver na string, a string ainda corresponde à expressão se houver outros caracteres também. Em vez disso, você deseja corresponder verdadeiro se x estiver lá e negar o resultado da função:

Not Regex.IsMatch("103", "0")

Not Regex.IsMatch("103&", "&")

Não que com esses exemplos simples, o String.IndexOF () ou String.Contains () normal () seria uma escolha melhor.

Me deparei com essa pergunta procurando a mesma coisa, mas para JavaScript. A expressão acima não funcionou no meu caso, mas me deparei com a expressão abaixo que funcionou. (Caso qualquer outra pessoa que procure uma solução JavaScript também acabe aqui.)

^((?!0).)*$

Esta construção é chamada de Lookahead negativo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top