2011-12-06 57 views
9

Me parece que no puede encontrar la manera de componer una expresión regular (utilizado en Javascript) que hace lo siguiente:de expresiones regulares negativo

de ajuste de todas las cadenas, donde los caracteres después del cuarto carácter no contienen "GP ".

Algunas cadenas ejemplo:

  • EDAR - partido!
  • EDARGP - no puede competir
  • EDARDTGPRI - no puede competir
  • ECMRNL - Partido de

me había amor ayuda aquí ...

+0

Me gustaría consumir los primeros cuatro caracteres y luego buscar GP. ¿Es necesaria una expresión regular incluso aquí? ¿Por qué no hacer algo como '" EDARGP ".slice (4) .indexOf ('GP') == -1'? – JesseBuesking

+0

Eso podría funcionar, excepto que no puedo cambiar el "código", solo puedo cambiar la cadena de expresiones regulares, ya que el código necesita trabajar con varios tipos de valores de entrada –

Respuesta

11

Use afirmaciones de ancho cero:

if (subject.match(/^.{4}(?!.*GP)/)) { 
    // Successful match 
} 

Explicación:

" 
^  # Assert position at the beginning of the string 
.  # Match any single character that is not a line break character 
    {4} # Exactly 4 times 
(?!  # Assert that it is impossible to match the regex below starting at this position (negative lookahead) 
    .  # Match any single character that is not a line break character 
     * # Between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
    GP # Match the characters “GP” literally 
) 
" 
+1

¿Cómo obtuviste esta explicación? Parece autogenerado, en cuyo caso me encantaría saber qué herramienta has estado usando. – Bart

+1

@Bart Regexbuddy :) – FailedDev

+0

Gracias @FailedDev! – Bart

7

Puede usar lo que se llama una búsqueda negativa hacia delante afirmación aquí. Mira en la cadena antes de la ubicación y solo coincide si el patrón contenido es/no/encontrado. Aquí está un ejemplo de expresiones regulares:

/^.{4}(?!.*GP)/ 

Estas estadísticas se corresponden sólo si, después de los primeros cuatro caracteres, no se encuentra la cadena GP.

+2

Has ganado la carrera. :) +1 – FailedDev

+0

Gracias, esto funciona. Simplemente no estoy seguro de qué es el "?!" parte hace ... –

2

podría hacer algo como esto:

var str = "EDARDTGPRI"; 
var test = !(/GP/.test(str.substr(4))); 

prueba volverá cierto para los partidos y falso de no.

+0

Buena alternativa. +1. – FailedDev

+1

@FailedDev gracias, pero, por supuesto, usted y Dan tienen la respuesta correcta: P muy bien hecho. –

+0

¿O sí? Su solución probablemente sea más rápida, por no mencionar que es más simple :) – FailedDev