regulares regular expressions expresiones expresion espacio ejemplo cualquier caracter blanco alfanumerico regex readability repetition

regex - regular - Usar repetición explícitamente numerada en lugar de signo de interrogación, estrella y más



regular expression javascript (4)

Puedo ver cómo, si tienes una expresión regular que hace una gran cantidad de repeticiones acotadas, es posible que desees usar la forma {n,m} forma consistente por motivos de legibilidad. Por ejemplo:

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

Pero no recuerdo haber visto un caso así en la vida real. Cuando veo que se usa {0,1} , {0,} o {1,} en una pregunta, casi siempre se hace por ignorancia. Y en el proceso de responder a esa pregunta, también deberíamos sugerir que usen el ? , * o + lugar.

Y, por supuesto, {1} es puro desorden. Algunas personas parecen tener la 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 inversa que está seguida por un dígito literal (por ejemplo, /1{1}0 ), pero hay otras formas de hacerlo.

He visto patrones regex que usan repetición explícitamente numerada 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 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"?

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 la repetición explícitamente numerada 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 hacer coincidir 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 necesita 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 ese criterio no se cumple, 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 muchas apariciones de {1} y {0,1} . 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.


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

El problema que anticipé es cuando puede que no seas la única persona que necesita trabajar con tu código. Los regex 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?"


  • Todos son idénticos a menos que estés usando un motor de expresiones regulares excepcional. Sin embargo, no todos los motores regex soportan 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í.