regex - solo - ¿Cómo hacer coincidir, pero no capturar, parte de una expresión regular?
javascript regex test (6)
Actualización: ¡Gracias a Germán Rodríguez Herrera!
En javascript, pruebe: /123-(apple(?=-)|banana(?=-)|(?!-))-?456/
Recuerde que el resultado está en el grupo 1
Tengo una lista de cadenas. Algunos de ellos son de la forma 123-...456
. La parte variable "..." puede ser:
- la cadena "apple" seguida de un guion, p. ej.
123-apple-456
- la cadena "banana" seguida de un guion, p. ej.
123-banana-456
- una cadena en blanco, por ejemplo,
123-456
(tenga en cuenta que solo hay un guion)
Cualquier palabra que no sea "manzana" o "plátano" no es válida.
Para estos tres casos, me gustaría hacer coincidir "manzana", "plátano" y "", respectivamente. Tenga en cuenta que nunca quiero capturar el guión, pero siempre quiero hacer coincidirlo . Si la cadena no tiene el formato 123-...456
como se describió anteriormente, entonces no hay ninguna coincidencia.
¿Cómo escribo una expresión regular para hacer esto? Supongamos que tengo un sabor que permite mirar hacia adelante, mirar hacia atrás, mirar hacia afuera y grupos que no capturan.
La observación clave aquí es que cuando tiene "manzana" o "banana", también debe tener el guión final, pero no desea que coincida. Y cuando está haciendo coincidir la cadena en blanco, no debe tener el guión final. Una expresión regular que encapsula esta afirmación será la correcta, creo.
Con mucho, el más simple (funciona para python) es ''123-(apple|banana)-?456''
.
He modificado una de las respuestas (por @ op1ekun):
123-(apple(?=-)|banana(?=-)|(?!-))-?456
La razón es que la respuesta de @ op1ekun también coincide con "123-apple456"
, sin el guión después de la manzana.
La única forma de no capturar algo es usar aserciones alternativas :
(?<=123-)((apple|banana)(?=-456)|(?=456))
Porque incluso con grupos que no capturan (?:…)
toda la expresión regular captura sus contenidos coincidentes. Pero esta expresión regular solo coincide con apple
o banana
si está precedida por 123-
y seguida por -456
, o coincide con la cadena vacía si está precedida por 123-
y seguida por 456
.
Prueba esto:
//d{3}-(?:(apple|banana)-)?/d{3}/
Tratar:
123-(?:(apple|banana|)-|)456
Eso coincidirá con la apple
, el banana
o una cadena en blanco, y después habrá un guión de 0 o 1. Estaba equivocado acerca de no tener la necesidad de un grupo de captura. Tonto de mí.