Uma expressão regular para excluir uma palavra / string

298

Eu tenho uma expressão regular da seguinte maneira:

^/[a-z0-9]+$

Isso corresponde a strings como /helloou /hello123.

No entanto, gostaria de excluir alguns valores de sequência, como /ignoremee /ignoreme2.

Eu tentei algumas variantes, mas não consigo fazer funcionar!

Minha última tentativa fraca foi

^/(((?!ignoreme)|(?!ignoreme2))[a-z0-9])+$

Qualquer ajuda seria apreciadas :-)

Romiem
fonte
1
Possível duplicada: stackoverflow.com/questions/1395177/…
Anderson Green

Respostas:

376

Aqui está outra maneira (usando uma visão negativa ):

^/(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$ 

Nota: Há apenas uma expressão de captura: ([a-z0-9]+).

Seth
fonte
1
Brilhante, isso parece ter funcionado. Na verdade, eu preciso dessa regra para reescrever URLs e queria ignorar a pasta "images", "css" e "js". Portanto, minha regra é a seguinte: ^ / (?! css | js | images) ([az] +) /? (\? (. +))? $ E reescreve para /Profile.aspx?id=$1&$3 Essa regra funcionará corretamente e propagará a string de consulta também? Portanto, se alguém visitar mydomain.com/hello?abc=123 , gostaria de reescrever para mydomain.com/Profile.aspx?id=hello&abc=123 Também estou um pouco inseguro sobre o desempenho de (. +) Em final para capturar a string de consulta na solicitação original.
romiem
Parece que isso é outra questão. O regexp que você possui parece capturar a string de consulta - test e verificar se a string de consulta aparece. Além disso - (\?(.+))?$deve ser rápido. Eu não me preocuparia muito com velocidade.
Seth
1
Isso não funcionou para mim, enquanto a solução de Alix Axel funcionou. Estou usando a java.util.regex.Patternclasse do Java .
precisa
1
Confirmo o reMark de Mark;) - por exemplo, Pycharm é baseado em Java, não é? Portanto, considerando as expressões regulares na solução de Alix da pesquisa Pycharm, a outra não.
nádegas
43

Isso deve servir:

^/\b([a-z0-9]+)\b(?<!ignoreme|ignoreme2|ignoreme3)

Você pode adicionar quantas palavras ignoradas quiser, aqui está uma implementação simples do PHP:

$ignoredWords = array('ignoreme', 'ignoreme2', 'ignoreme...');

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string);
Alix Axel
fonte
Eu pensei que look-behind requer um padrão de largura fixa?
simon
2
@AlixAxel Sim, mas as bibliotecas de expressões regulares mais inteligentes permitirão uma alternância com comprimentos variados para as alternativas (e usarão a mais longa), desde que cada alternativa seja de comprimento fixo.
ChrisF
isso é inteligente, mas falha para mim se a palavra ignorada estiver no final de qualquer outra palavra. ou seja, se você adicionar 'a' como um fora as palavras ignoradas, então qualquer palavra que termina em um é ignorado
singmotor
21

Como você deseja excluir as duas palavras, você precisa de uma conjunção:

^/(?!ignoreme$)(?!ignoreme2$)[a-z0-9]+$

Agora, ambas as condições devem ser verdadeiras (nem o ignoreme nem o ignoreme2 são permitidos) para ter uma correspondência.

quiabo
fonte
1
Isso é equivalente ao menor acima, que é um indicador negativo de um conjunto de alternativas.
ChrisF
4
@ ChrisF Não, na verdade não. A solução da Seth não iria coincidir com algo parecido /ignoremenotcomo o /é seguido por ignoreme.
Gumbo