Pergunta

Como faço para escrever um regex para coincidir com qualquer seqüência que não cumpre um determinado padrão? Eu sou confrontado com uma situação onde eu tenho que corresponder a um padrão (A e ~ B).

Foi útil?

Solução

Você pode usar uma afirmação de olhar em frente:

(?!999)\d{3}

Este exemplo combina três outros dígitos que 999.


Mas se acontecer de não ter uma implementação de expressão regular com esse recurso (consulte Comparação de Sabores Expressões Regulares ), você provavelmente terá que construir uma expressão regular com os recursos básicos em seu próprio país.

A expressão regular compatível com sintaxe básica só seria:

[0-8]\d\d|\d[0-8]\d|\d\d[0-8]

Isso também coincide com quaisquer três seqüência de dígitos que não é 999.

Outras dicas

Se você quiser combinar uma palavra A em uma string e não para coincidir com uma palavra B. Por exemplo: Se você tiver um texto:

1. I have a two pets - dog and a cat
2. I have a pet - dog

Se você quiser procurar linhas de texto que tem um cão para um animal de estimação e não tem gato você pode usar esta expressão regular:

^(?=.*?\bdog\b)((?!cat).)*$

Ele vai encontrar apenas a segunda linha:

2. I have a pet - dog

Jogo contra o padrão e usar a língua de acolhimento para inverter o resultado boolean da partida. Isso será muito mais legível e de fácil manutenção.

notnot, ressuscitar esta questão antiga porque tinha uma solução simples que não foi mencionado. (Encontrado sua pergunta ao fazer alguma pesquisa para um regex recompensas busca .)

Eu sou confrontado com uma situação onde eu tenho que corresponder a um (A e ~ B) padrão.

O regex básica para isso é assustadoramente simples: B|(A)

Você simplesmente ignorar os jogos gerais e examinar as capturas Grupo 1, que irá conter A.

Um exemplo (com todas as renúncias sobre análise de HTML em regex): A é dígitos, B é dígitos dentro <a tag

O regex: <a.*?<\/a>|(\d+)

Demonstração (olhada Grupo 1 no painel inferior direito)

Referência

Como correspondem ao padrão exceto em situações S1, S2, S3

Como corresponder a um padrão a menos que ...

O complemento de uma linguagem regular é também uma linguagem regular, mas para construí-lo você tem que construir a DFA para a linguagem regular, e fazer qualquer mudança de estado válida em um erro. Consulte este para um exemplo. O que a página não diz é que ele converteu /(ac|bd)/ em /(a[^c]?|b[^d]?|[^ab])/. A conversão de uma parte traseira DFA a uma expressão regular não é trivial. É mais fácil se você pode usar a expressão regular inalterado e mudar a semântica no código, como sugerido antes.

padrão - re

str.split(/re/g) 

retornará tudo, exceto o padrão.

Test aqui

A minha resposta aqui pode resolver o seu problema assim:

https://stackoverflow.com/a/27967674/543814

  • Em vez de substituir, você usaria Match.
  • Em vez de $1 grupo, você leria $2 grupo.
  • $2
  • Grupo foi feito não capturar lá, o que você iria evitar.

Exemplo:

Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");

O primeiro grupo de captura especifica o padrão que você deseja evitar. A última grupos de captura captura tudo o resto. Basta ler em grupo, $2.

(B)|(A)

, em seguida, usar o grupo 2 captura ...

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