2011-10-18 31 views
23

Estoy tratando de armar una expresión regular para encontrar cuando las palabras específicas no existen en una cadena. Específicamente, quiero saber cuándo no existe "trunk", "tags" o "branches" (esto es para un enlace de precompilación de Subversion). Sobre la base de la respuesta Regular expression to match string not containing a word puedo hacer esto fácilmente para una palabra usando negativos look-rodeos:Regex para cadena que no contiene varias palabras específicas

^((?!trunk).)*$ 

Es el operador "AND" Estoy luchando con y me parece que no puede conseguir combinaciones que incluyen los otros dos palabras trabajando

Esto está funcionando muy bien en .NET con una sola palabra:

var exp = new Regex(@"^((?!trunk).)*$"); 
exp.IsMatch("trunk/blah/blah"); 

Se volverá falsa en su estado actual o verdadero si "tronco" no existe en el camino en la segunda línea.

¿Qué me falta aquí?

+0

Por qué no puedes simplemente hacer una normal de "búsqueda de" expresiones regulares e invertir el resultado en su lugar? –

+1

Estoy limitado por solo poder editar la expresión regular, no la lógica circundante. –

Respuesta

56

Usar un negativo look-ahead que afirma la ausencia de cualquiera de las tres palabras en algún lugar de la entrada:

^(?!.*(trunk|tags|branches)).*$ 

También reorganizado ligeramente su expresión regular para corregir errores menores.

+1

Hay un paréntesis abierto sin igual en ese caso y, suponiendo que sea extraño, no está funcionando con un patrón como "bla/bla/bla" (no se devuelve ninguna coincidencia). –

+0

@TroyHunt Oops - dejó fuera un soporte. Lo probé y funciona para mí (aunque en java). Probar ahora. – Bohemian

+0

Perfecto, funciona bien ahora :) –

3

Utilice un partido "estándar" y buscar !IsMatch

var exp = new Regex(@"trunk|tags|branches"); 
var result = !exp.IsMatch("trunk/blah/blah"); 

Por qué personas les gusta hacer su vida más difícil?

Ah ... ¡Y recuerde el principio ass! http://www.codinghorror.com/blog/2008/10/obscenity-filters-bad-idea-or-incredibly-intercoursing-bad-idea.html

Así que sería mejor escribir

var exp = new Regex(@"\b(trunk|tags|branches)\b"); 

Pero si realmente necesita una expresión lookahed negativo, y mantenerse al día con el principio ass

var exp = new Regex(@"^(?!.*\b(trunk|tags|branches)\b)"; 

Tester: http://gskinner.com/RegExr/?2uv1g

Notaré que si buscas caminos completos (palabras separadas por / o \) entonces

var exp = new Regex(@"^(?!.*(^|\\|/)(trunk|tags|branches)(/|\\|$))"; 

Tester: http://gskinner.com/RegExr/?2uv1p

+0

Gracias, pero desafortunadamente la restricción en este caso requiere que el trabajo se realice en la expresión regular y no puedo controlar el código fuera de esta para invertir la condición. –

+0

@TroyHunt cambiado – xanatos

Cuestiones relacionadas