Quiero eliminar todos los guiones iniciales y finales (-) y reemplazar los guiones repetitivos con un guión de lo contrario en JavaScript. He desarrollado una expresión regular para hacerlo:

"----asdas----asd-as------q---".replace(/^-+()|()-+$|(-)+/g,'$3')

Y funciona:

asdas-asd-as-q

Pero no entiendo la parte $3 (obtenida a través de un experimento desesperado). ¿Por qué no $1?

1
Jakub Fedyczak 3 sep. 2014 a las 17:17

4 respuestas

La mejor respuesta

En realidad, puede usar esto sin ningún grupo de captura:

"----asdas----asd-as------q---".replace(/^-+|-+$|-+(?=-)/g, '');
//=> "asdas-asd-as-q"

Aquí -+(?=-) es una anticipación positiva que se asegura de que coincida con 1 o más guiones excepto el último - en la coincidencia.

3
anubhava 3 sep. 2014 a las 13:21

Porque hay 3 grupos de captura. (dos redundantes vacías y (-)). $3 reemplazado con la cadena que coincide con el tercer grupo.

Si elimina los dos primeros grupos de captura vacíos, puede usar $1.

"----asdas----asd-as------q---".replace(/^-+|-+$|(-)+/g, '$1')
// => "asdas-asd-as-q"
3
falsetru 3 sep. 2014 a las 13:18

$ son los grupos de reemplazo que se están formando.

Ver demo.

http://regex101.com/r/pP3pN1/25

En el lado derecho puede ver los grupos generados por ().

Reemplace y vea. $ 1 está en blanco en su caso.

1
vks 3 sep. 2014 a las 13:21

Como dicen otras respuestas, $3 indica el tercer subpatrón capturado, es decir. Tercer conjunto de paréntesis.

Personalmente, sin embargo, lo vería como dos operaciones, y lo haría así:

  1. Recorte los - s iniciales y finales
  2. Condensar duplicada - s

Así:

"----asdas----asd-as------q---".replace(/^-+|-+$/g,"").replace(/--+/g,"-");

Este tipo de concepto puede significar más código, pero creo que hace que sea mucho más fácil leer y comprender lo que está sucediendo aquí, porque estás haciendo una cosa a la vez en lugar de intentar hacer todo de una vez.

2
Niet the Dark Absol 3 sep. 2014 a las 13:22