Usar repeticiones numeradas explícitamente en lugar de signos de interrogación, estrellas y más

Resuelto polygenelubricants asked hace 14 años • 4 respuestas

He visto patrones de expresiones regulares que usan repeticiones numeradas explícitamente en lugar de y ?, es decir:*+

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

Las preguntas son:

  • ¿Son idénticas estas dos formas? ¿Qué pasa si agregas modificadores posesivos/reacios?
  • Si son idénticos, ¿cuál es más idiomático? ¿Más legible? ¿Simplemente "mejor"?
polygenelubricants avatar Jun 13 '10 21:06 polygenelubricants
Aceptado

Que yo sepa son idénticos. Creo que quizás haya algunos motores que no admitan 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 una repetición numerada explícitamente es cuando la repetición es mayor que 1:

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

Tiendo a preferir estos, especialmente cuando el patrón repetido tiene más de unos pocos caracteres. Si tienes que unir 3 números, a algunas personas les gusta escribir: \d\d\dpero yo prefiero escribir \d{3}porque enfatiza el número de repeticiones involucradas. Además, en el futuro, si ese número alguna vez necesita cambiar, solo necesito cambiar {3}y {n}no volver a analizar la expresión regular en mi cabeza ni 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 dificulta su lectura. Trabajé en un proyecto en el que algunos desarrolladores no conocían demasiado bien las expresiones regulares (no es exactamente el tema favorito de todos) y vi muchas {1}ocurrencias {0,1}. Algunas personas me pedirían que revisara el código de su patrón y ahí es cuando sugeriría cambiar esas apariciones a notación taquigráfica y ahorrar espacio y, en mi opinión, mejorar la legibilidad.

Ahmad Mageed avatar Jun 13 '2010 15:06 Ahmad Mageed

Puedo ver cómo, si tiene una expresión regular que hace muchas repeticiones limitadas, es posible que desee utilizar el {n,m}formulario de forma coherente por razones de legibilidad. Por ejemplo:

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

Pero no recuerdo haber visto nunca un caso así en la vida real. Cuando veo {0,1}o se utiliza en una pregunta, {0,}prácticamente {1,}siempre lo hago por ignorancia. Y en el proceso de responder a esa pregunta, también deberíamos sugerir que utilicen ?, *o +en su lugar.

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

Alan Moore avatar Jun 13 '2010 22:06 Alan Moore
  • Todos son idénticos a menos que estés usando un motor de expresiones regulares excepcional. Sin embargo, no todos los motores de expresiones regulares admiten 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í.

tiftik avatar Jun 13 '2010 15:06 tiftik

Son equivalentes (y descubrirá si están disponibles probando su contexto).

El problema que anticipo es que es posible que usted no sea la única persona que necesite trabajar con su código. Las expresiones regulares son bastante difíciles para la mayoría de las personas. Cada vez que alguien utiliza una sintaxis inusual, surge la pregunta: "¿Por qué no lo hicieron de la forma estándar? ¿Qué pensaban que me estaba perdiendo?".

dkretz avatar Jun 13 '2010 16:06 dkretz