Es una pregunta simple sobre expresiones regulares, pero no encuentro la respuesta.
Quiero determinar si un número aparece en secuencia exactamente dos o cuatro veces. ¿Qué sintaxis puedo utilizar?
\d{what goes here?}
Lo intenté \d{2,4}
, pero esta expresión también acepta tres dígitos.
abc 123 xyz
? ¿Debería coincidir12
porque son exactamente dos dígitos en secuencia? ¿O no debería hacerlo, porque12
es parte de una secuencia de dígitos más grande123
que no tiene ni 2 ni 4 de largo? Si tuviera que adivinar, pensaría que desea este último comportamiento, pero su pregunta no está claro. Los ejemplos y / o una especificación más clara ayudarían. La misma pregunta paraabc 12345 def
... ¿qué debería pasar allí?Respuestas:
No hay una sintaxis específica para eso, pero hay muchas formas de hacerlo:
(?:\d{4}|\d{2}) <-- alternation: four digits or two \d{2}(?:\d{2})? <-- two digits, and optionally two more (?:\d{2}){1,2} <-- two digits, times one or two
fuente
\d{2}(?:\d{2})?
solución desde el principio, una buena variedad de estas, la última, en particular, parecía muy agradable y escalable.(?:
esto, comienza un "grupo de no captura" (un grupo que no está destinado a ser referenciado en una declaración de reemplazo). También puede usar parens, pero estos crearán un grupo de captura. Más detalles aquí: stackoverflow.com/questions/3512471/non-capturing-group"333"
. Es posible que esté utilizando la funcionalidad "buscar subcadena coincidente" de su biblioteca de expresiones regulares por error, en lugar de su funcionalidad "verificar si la cadena completa coincide". Debes consultar su documentación.(?<!\d)(\d{2}|\d{4})(?!\d)
Esta es la forma correcta de hacerlo. La respuesta aceptada es incorrecta.
Coincidiría con 3 dígitos (o 5). Entonces eso está mal en mis ojos .
1) Compruebe que no haya ningún dígito antes de una secuencia de 2 o 4 dígitos, o después de una secuencia de dos o cuatro dígitos.
(<!)
la sintaxis es retroceso negativo(?!)
la sintaxis es una búsqueda anticipada negativa.Lo anterior funcionaría para la cuerda media:
Si la cadena de búsqueda no tiene contenido alrededor de él se podría utilizar el
^
e$
iniciar y terminar de anclajes de cadena:^\d{4}$|^\d{2}$
fuente
(?<!\d)(\d{2}|\d{4})(?!\d)
^\d{4}$|^\d{2}$
sería una forma potencial de solucionarlo. Como lo haría^\d{2}(?!\d)|^\d{4}(?!\d)