2012-01-24 5 views
6

tenga en cuenta lo siguiente código javascript:Sustitución de sólo una parte de la expresión regular a juego

"myObject.myMethod();".replace(/\.\w+\(/g, "xxx"); 

da "myObjectxxx);", como se selecciona ".myMethod(".

Ahora solo seleccionaría myMethod en su lugar. En otras palabras, quiero seleccionar cualquier palabra que comience por . y que termine en ( (excluida).

Gracias, Luca.

Respuesta

18

respuesta general: Captura de la parte que desea mantener con paréntesis, e incluyen en la cadena de sustitución como $1.

Consulte los tutoriales de sustitución de expresiones regulares para obtener detalles.

Aquí: simplemente incluya el . y el ( en su cadena de sustitución.

Para un ejercicio, escribe una expresión regular que dará vuelta a cualquier cadena del esquema --ABC--DEF-----DEF--ABC-- de cartas-valores arbitrarios de ABC y DEF. Entonces, --XY--IJK-- debe convertirse en --IJK--XY--. Aquí realmente necesita usar grupos de captura y referencias.

+0

¡Muchas gracias! Finalmente he entendido el uso de paréntesis y $ en sustituciones ... – lviggiani

3

Usted puede utilizar lookaround afirmaciones:

.replace(/(?<=\.)\w+(?=\()/g, 'xxx') 

Los permitirá que el partido tenga éxito, mientras que al mismo tiempo no ser parte del propio partido. Por lo tanto, estás reemplazando solo la parte intermedia.

La opción más fácil para personas no familiarizadas con expresiones regulares es probablemente sólo incluyen la . y ( en la sustitución, así:

.replace(/\.\w+\(/g, ".xxx(") 
+2

Una especie de solución para no usar '\ 1', ¿no es así? Quiero decir, demasiadas personas no saben acerca de mirar hacia adelante y mirar hacia atrás, pero a menudo se asocian con un costo mayor. En particular aquí, cuando están al principio o la endo del hilo que se reemplazará de todos modos. –

+0

Quizás. Sin embargo, hay dos piezas que guardar, por lo que necesitas esencialmente '-replace '(\.) \ W + (\()', '$ 1xxx $ 2'' (lo siento, volviendo a PowerShell). Dudo que sea más legible que '-replace '\. \ w + \ (', '.xxx (' '. En cualquier caso, lookaround no sería notablemente más costoso (si es que lo es), y enseñar conceptos nuevos a la gente difícilmente puede considerarse incorrecto. – Joey

+0

Sí, echaba de menos que las cadenas son cadenas fijas. Por supuesto, es más fácil simplemente incluirlas de inmediato. Sin embargo, debería aprender sobre el uso de grupos de captura, por ejemplo, para intercambiar dos valores. –

1

me gustaría sugerir un enfoque ligeramente diferente:

"myObject.myMethod();".replace(/^([^\.]*\.)\w+(\(.*)$/g, "$1xxx$2"); 

través de las soluciones más simples se han sugerido.

+0

Bueno, ese es el que también sugerí. Los grupos de captura son una característica clave de las expresiones regulares, todos deberían saberlo. –

+0

@ Anony-Mousse: De acuerdo, pero estoy un poco confundido sobre el '\ 1' en tu respuesta. IIRC, esa es solo la forma de referenciar un grupo dentro de la expresión regular y no la cadena de reemplazo, que requiere '$ 1'.Por favor corrígeme si me equivoco al respecto. –

+0

Esto depende de su dialecto de expresiones regulares. Supongo que JS usa '$ 1' solamente. Perl hace las dos cosas, y sed usa '\ 1' IIRC. –

Cuestiones relacionadas