¿Grupos de captura estática?
Frecuentes
Visto 94 equipos
-1
Digamos que tenemos la siguiente expresión regular:
((a(.+?)c ?)+)
Esto coincidirá con:
abc acc aac
Lo que quiero hacer:
((a(.+?)c ?)(a\3c ?)*)
Así que solo coincidiré
abc abc abc
or
acc acc acc
pero no el artículo #2 (abc acc aac)
... Pero sin la referencia inversa.
Básicamente, quiero que el tercer grupo de captura en el n. ° 3 (.+?) Siempre coincida con lo que tenía el primer partido.
¿Es esto posible?
Para hacer las cosas más difíciles, esto deberá funcionar en el motor de expresiones regulares de JavaScript.
1 Respuestas
0
no puede capturar el espacio final si varía porque el valor memorizado se comparará literalmente en referencias posteriores. mover la variación fuera de los paréntesis de captura lo simplifica:
var rx= /(a(.+?)c) ?\1 ?\1/g ;
// tests/demo
"abc abc abc".match(rx) // ["abc abc abc"]
"abc acc abc".match(rx) // null
"abc acc aac".match(rx) // null
"acc acc acc".match(rx) // ["acc acc acc"]
entonces, son algunos caracteres adicionales de repetición para permitir espacios opcionales, pero funciona.
Respondido 14 Feb 14, 01:02
esperaba encontrar algo sin retroreferencia - user3281506
no estoy seguro de entender basado en sus ejemplos. ¿Desea codificar una RegExp diferente para "abc abc abc" que para "abc acc abc"? usted enumera algunas combinaciones y cubrirlas todas tomaría muchos objetos RegExp ... - dandavis
La segunda expresión regular hace exactamente lo que quiero, pero quiero saber si es posible hacerlo sin una referencia posterior. También debe coincidir con "adc adc adc" o "axc axc axc", pero el carácter del medio (sea lo que sea) debe ser el mismo en cada repetición. También debo señalar que esta no es la expresión regular exacta que estoy tratando de construir, sino una versión simplificada de la misma. - user3281506
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas javascript regex or haz tu propia pregunta.
quieres una expresión regular sin retroreferencia? Porque parece que la referencia inversa es lo que necesita:
((a(.+?)c ?)(a(.+?)c ?)(a\3c ?)*)
- acdcjuniorsí, js admite referencias inversas y la mayoría de las otras funciones de expresiones regulares de perl en las que se basa ... - dandavis
@dandavis ¡Acabo de probar, no sabía esto! Siempre pensé que no funcionaba en JavaScript. Ahora ha abierto un nuevo RegExp mundo para mí (no es que realmente lo use mucho sobre operaciones de cadena) - Paul S.
Sé que es posible en el motor de JS usar referencias inversas, pero eso es exactamente lo que intento evitar. Te obliga a poner subexpresiones redundantes en tu expresión regular que sería bueno eliminar por el bien de la legibilidad. - user3281506
RegExp y readable nunca deben usarse en la misma oración... - dandavis