2010-06-13 20 views
41

que he visto patrones de expresiones regulares que utilizan la repetición numerados de forma explícita en lugar de ?, * y +, es decir:Uso numerados de forma explícita la repetición en lugar de signo de interrogación, estrella y además

Explicit   Shorthand 
(something){0,1} (something)? 
(something){1}  (something) 
(something){0,}  (something)* 
(something){1,}  (something)+ 

Las preguntas son:

  • ¿Son estas dos formas idénticas? ¿Qué sucede si agrega modificadores posesivos/reacios?
  • Si son idénticos, ¿cuál es más idiomático? Más legible? Simplemente "mejor"?

Respuesta

55

Que yo sepa, son idénticos. Creo que hay algunos motores que no admiten la sintaxis numerada, pero no estoy seguro de cuál. Recuerdo vagamente una pregunta sobre SO hace unos días en la que la notación explícita no funcionaría en Notepad ++.

La única vez que usaría repetición numerada explícitamente es cuando la repetición es mayor que 1:

  • exactamente dos: {2}
  • Dos o más: {2,}
  • Dos a cuatro: {2,4}

Tiendo a preferir estos especialmente cuando el patrón repetido es más que unos pocos caracteres. Si tiene que unir 3 números, a algunas personas les gusta escribir: \d\d\d, pero prefiero escribir \d{3} ya que enfatiza el número de repeticiones involucradas. Además, en el futuro si ese número alguna vez tiene que cambiar, solo necesito cambiar {3} a {n} y no volver a analizar la expresión regular en mi cabeza o preocuparme por estropearla; requiere menos esfuerzo mental.

Si no se cumple ese criterio, prefiero la taquigrafía. El uso de la notación "explícita" rápidamente desordena el patrón y hace que sea difícil de leer. Trabajé en un proyecto donde algunos desarrolladores no conocían demasiado la expresión regular (no es exactamente el tema favorito de todos) y vi un montón de {1} y {0,1} ocurrencias. Algunas personas me pedirían que revise el código de su patrón y es entonces cuando sugiero cambiar esas ocurrencias a la notación abreviada y ahorrar espacio y, IMO, mejorar la legibilidad.

+0

+1, yo también creo que la taquigrafía es mejor, pero también me encantan los ternaries anidados, y me han gritado virtualmente por hacerlo. Puedo ver que algunas personas pueden pensar que '{0,1}' "muestra la intención más claramente" que '?', De ahí la Q. – polygenelubricants

2
  • Todos son idénticos a menos que esté utilizando un excepcional motor de expresiones regulares. Sin embargo, no todos los motores regex son compatibles con la repetición numerada, ? o +.

  • Si todos están disponibles, usaría caracteres en lugar de números, simplemente porque es más intuitivo para mí.

1

Son equivalentes (y se dará cuenta si están disponibles mediante las pruebas de su contexto.)

El problema me anticipo es cuando puede no ser la única persona que necesitan para trabajar con tu código Las expresiones regulares son lo suficientemente difíciles para la mayoría de las personas. Cada vez que alguien usa una sintaxis inusual, surge la pregunta : "¿Por qué no lo hicieron de la manera estándar? ¿Qué estaban pensando que me estoy perdiendo?"

7

puedo ver cómo, si usted tiene una expresión regular que hace un montón de repetición acotada, es posible que desee utilizar el formulario {n,m} constantemente por el bien de la legibilidad Por ejemplo:.

/^ 
abc{2,5} 
xyz{0,1} 
foo{3,12} 
bar{1,} 
$/x 

pero puedo' Recuerdo haber visto un caso así en la vida real. Cuando veo que {0,1}, {0,} o {1,} se usan en una pregunta, casi siempre se hace por ignorancia. Y en el proceso de responder a esa pregunta, también deberíamos sugerir que utilice el ?, * o + en su lugar.

Y, por supuesto, {1} es puro desorden. Algunas personas parecen tener una vaga noción de que significa "uno y solo uno": después de todo, debe significar algo, ¿verdad? ¿Por qué un lenguaje tan patológicamente concisa apoyar una construcción que ocupa un total de tres caracteres y no hace nada en absoluto? Su único uso legítimo que conozco es aislar una referencia posterior seguida de un dígito literal (por ejemplo, \1{1}0), pero hay otras formas de hacerlo.

Cuestiones relacionadas