2008-10-16 34 views
11

Tengo este regex que construí y probé en regex buddy.¿Qué es un "Cuantificador anidado" y por qué está causando que mi expresión regular falle?

"_ [ 0-9]{10}+ {1}+[ 0-9]{10}+ {2}+[ 0-9]{6}+ {2}[ 0-9]{2}" 

Cuando utilizo esto en C# .Net

recibo excepción

"parsing \"_ [ 0-9]{10}+ +[ 0-9]{10}+ +[ 0-9]{6}+ [ 0-9]{2}\" - Nested quantifier +." 

¿Qué significa este error? Aparentemente .net no le gusta la expresión.

Aquí es el compañero de expresiones regulares, así que puedes entender mi intención con la expresión regular ...

_ [ 0-9]{10}+ {1}+[ 0-9]{10}+ {2}+[ 0-9]{6}+ {2}[ 0-9]{2} 

Match the characters "_ " literally «_ » 
Match a single character present in the list below «[ 0-9]{10}+» 
    Exactly 10 times «{10}+» 
    The character " " « » 
    A character in the range between "0" and "9" «0-9» 
Match the character " " literally « {1}+» 
    Exactly 1 times «{1}+» 
Match a single character present in the list below «[ 0-9]{10}+» 
    Exactly 10 times «{10}+» 
    The character " " « » 
    A character in the range between "0" and "9" «0-9» 
Match the character " " literally « {2}+» 
    Exactly 2 times «{2}+» 
Match a single character present in the list below «[ 0-9]{6}+» 
    Exactly 6 times «{6}+» 
    The character " " « » 
    A character in the range between "0" and "9" «0-9» 
Match the character " " literally « {2}» 
    Exactly 2 times «{2}» 
Match a single character present in the list below «[ 0-9]{2}» 
    Exactly 2 times «{2}» 
    The character " " « » 
    A character in the range between "0" and "9" «0-9» 

En resumen ...

¿Qué es un cuantificador anidada?

Respuesta

9

.NET se queja del + después del cuantificador de estilo {n} ya que no tiene ningún sentido. {n} significa que coincide exactamente con n de un grupo determinado. + significa que coincide uno o más de un grupo determinado. Elimine el + y compilará bien.

"_ [ 0-9]{10} {1}[ 0-9]{10} {2}[ 0-9]{6} {2}[ 0-9]{2}" 
+2

En ciertos sabores de expresiones regulares {min, max} + es un cuantificador posesivo, pero .Net no los admite. Si está utilizando Regex buddy, puede decirle con qué sabor de expresión regular está trabajando haciendo clic derecho en el panel de composición y seleccionando su "Sabor" en la lista desplegable. – Grokodile

2

Tienen razón. Esta versión de la expresión regular no falla:

(_ [ 0-9]{10})+(\s{1})+([ 0-9]{10})+(\s{2})+([ 0-9]{6})+\s{2}[ 0-9]{2}

Aviso el uso de parens para crear grupos que luego pueden repetir una o más veces. Además, debe ser más específico y usar \ s en lugar de un espacio, ya que el espacio en blanco del patrón puede tener o no significado.

Por cierto, esta expresión regular no parece tan útil. Es posible que desee hacer otra pregunta en la línea de "¿Cómo uso la expresión regular para que coincida con este patrón?"

+0

Bueno, esto es solo un fragmento de la expresión regular completa es esta ... _ [0-9] {10} {1} [0-9] {10} {2} [0-9] {6} {2 } [0-9] {2} | _ [0-9] {10} {1} [0-9] {10} {2} [0-9] {6} {2} [0-9] { 2} | _ [0-9] {10} {1} [0-9] {10} {2} [0-9] {6} {2} [0-9] {2} Sus campos de vuelta mientras uno no esté en blanco ... y me gusta la idea. Gracias – ctrlShiftBryan

+0

Estoy casi seguro de que Regex podría reducirse en gran medida. En serio, haga una pregunta sobre cómo hacerlo y proporcione algunos datos de muestra. – Will

11

.NET no apoyar la possessive quantifier

{10}+ 

Sin embargo, {10} deben tener exactamente el mismo efecto. El + evita retroceder e intentar coincidencias más cortas si falla la coincidencia más larga, pero dado que {10} solo puede coincidir exactamente con 10 caracteres para comenzar, esto no logra mucho.

"_ [ 0-9]{10} [ 0-9]{10} {2}[ 0-9]{6} {2}[ 0-9]{2}" 

debería estar bien. También he descartado el bit "{1} +". Como coincide exactamente una vez, "A {1} +" es equivalente a solo "A".

EDITAR Como dice Porges, si necesita cuantificadores posesivos en .NET, entonces grupos atómicos dan la misma funcionalidad con (>[0-9]*) equivalente a [0-9]*+.

+0

Genial. No me di cuenta de que algunos motores de expresiones regulares proporcionaron esta opción. – Duncan

+0

Creo que deberías poder emular los cuantificadores posesivos usando grupos atómicos, es decir, en lugar de '[0-9] {10} +', usa '(?> [0-9] {10})'. – porges

2

Si selecciona el sabor .NET en la barra de herramientas en la parte superior en RegexBuddy, RegexBuddy indicará que .NET no admite cuantificadores posesivos como {10} +.

Dado que {10} permite solo un número específico de repeticiones, hacerlo vago o posesivo no tiene sentido, incluso si es sintácticamente válido en los sabores de expresiones regulares que admiten cuantificadores perezosos y/o posesivos. Quitar los signos + de su expresión regular lo hará funcionar bien con .NET.

En otras situaciones, haga doble clic en el error sobre el cuantificador posesivo en la pestaña Crear en RegexBuddy. RegexBuddy luego reemplazará el cuantificador posesivo con un grupo atómico funcionalmente equivalente.

Si genera un fragmento de código fuente para un idioma .NET en la pestaña Usar en RegexBuddy, RegexBuddy reemplazará automáticamente los cuantificadores posesivos en la expresión regular en el fragmento de código fuente.

Cuestiones relacionadas