2010-01-16 18 views
160

tengo una expresión regular de la siguiente manera:una expresión regular para excluir una palabra/cadena

^/[a-z0-9]+$ 

Esto coincide con cadenas como /hello o /hello123.

Sin embargo, me gustaría excluir un par de valores de cadena como /ignoreme y /ignoreme2.

¡He intentado algunas variantes pero parece que ninguna funciona!

Mi último intento débil se

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

Cualquier ayuda sería muy apreciada agradecido :-)

+0

Posible duplicado: http://stackoverflow.com/questions/1395177/regex-to-exclude-a-specific-string-constant –

Respuesta

215

Aquí hay otra manera: (utilizando un negative look-ahead):

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

Nota: Solo hay una sola expresión de captura: ([a-z0-9]+).

+1

Brillante, que parece haberlo hecho. De hecho, necesito esta regla para la reescritura de URL y quería ignorar la carpeta "images", "css" y "js". Entonces mi regla es la siguiente: ^/(?! css | js | images) ([az] +) /? (\? (. +))? $ y se reescribe a /Profile.aspx?id= $ 1 y $ 3 ¿Esta regla funcionará correctamente y propagará la cadena de consulta también? Entonces, si alguien visita http://mydomain.com/hello?abc=123 , me gustaría reescribirlo en http://mydomain.com/Profile.aspx?id=hello&abc=123 También soy un no estaba seguro sobre el rendimiento de (. +) al final para capturar la cadena de consulta en la solicitud original. – romiem

+0

Suena como esta es otra pregunta. La expresión regular que tiene parece que capturará la cadena de consulta: pruebe y vea si aparece su cadena de consulta. También - '(\? (. +))?$ 'debe ser rápido. No me preocuparía demasiado por la velocidad. – Seth

+0

Esto no funcionó para mí, mientras que la solución de Alix Axel funcionó. Estoy usando la clase 'java.util.regex.Pattern' de Java. –

10

Como desea excluir ambas palabras, se necesita una conjunción:

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

Ahora Ambas condiciones deben ser verdaderas (ni ignoreme ni ignoreme2 está permitido) tener am atch

+0

Esto es equivalente al anterior más corto que es un lookahead negativo de un conjunto de alternativas . – ChrisF

+1

@ChrisF No, en realidad no. La solución de Seth no coincidiría con algo como '/ ignoremenot' ya que'/'es seguido por' ignoreme'. – Gumbo

26

Esto debe hacerlo:

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

Usted puede agregar tanto ignorado palabras como quiera, aquí es una sencilla aplicación PHP:

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

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string); 
+0

¿pensé que mirar hacia atrás requiere un patrón de ancho fijo? – simon

+0

@simon: ¿verdad? –

+2

@AlixAxel Sí, pero las regex libs más inteligentes permitirán una alternancia con longitudes variables para las alternativas (y utilizarán la más larga), siempre que cada alternativa sea de longitud fija. – ChrisF

Cuestiones relacionadas