Tengo código HTML antes y después de la cadena:
name="some_text_0_some_text"
Me gustaría reemplazar el 0
por algo como:!NEW_ID!
Entonces hice una expresión regular simple:
.*name="\w+(\d+)\w+".*
Pero no veo cómo reemplazar exclusivamente el bloque capturado.
¿Hay alguna manera de reemplazar un resultado capturado como ($ 1) por alguna otra cadena?
El resultado sería:
name="some_text_!NEW_ID!_some_text"
javascript
regex
Nicolas Guillaume
fuente
fuente
$
, por lo que la primera palabra(\w+)
está en un grupo, y se convierte en$1
, la parte central(\d+)
es el segundo grupo, (pero obtiene ignorado en el reemplazo), y el tercer grupo es$3
. Entonces, cuando asigna la cadena de reemplazo de"$1!new_ID!$3"
, $ 1 y $ 3 se reemplazan automáticamente con el primer grupo y el tercer grupo, lo que permite que el segundo grupo se reemplace con la nueva cadena, manteniendo el texto que lo rodea.Ahora que Javascript tiene retrospectiva (a partir de ES2018 ), en entornos más nuevos, puede evitar grupos por completo en situaciones como estas. Más bien, mire hacia atrás para lo que viene antes del grupo que estaba capturando, y busque para después, y reemplace con solo
!NEW_ID!
:Con este método, la coincidencia completa es solo la parte que necesita ser reemplazada.
(?<=name="\w+)
- Mire hacia atrásname"
, seguido de caracteres de palabras (¡afortunadamente, las miradas hacia atrás no tienen que tener un ancho fijo en Javascript!)\d+
- Haga coincidir uno o más dígitos: la única parte del patrón que no está en una búsqueda, la única parte de la cadena que estará en la coincidencia resultante(?=\w+")
- Buscar caracteres de palabra seguidos de"
`Tenga en cuenta que mirar atrás es bastante nuevo. Funciona en versiones modernas de V8 (incluyendo Chrome, Opera y Node), pero no en la mayoría de los otros entornos , al menos todavía no. Por lo tanto, si bien puede usar mirar hacia atrás de manera confiable en Node y en su propio navegador (si se ejecuta en una versión moderna de V8), todavía no es lo suficientemente compatible con clientes aleatorios (como en un sitio web público).
fuente
\d+
, ¿verdad?match => match * 2
. Los dígitos siguen siendo todo el partido, por lo que no hay necesidad de gruposUna pequeña mejora en la respuesta de Matthew podría ser una anticipación en lugar del último grupo de captura:
O podría dividirse en el decimal y unirse con su nueva identificación de esta manera:
Ejemplo / Benchmark aquí: https://codepen.io/jogai/full/oyNXBX
fuente
Con dos grupos de captura también habría sido posible; También habría incluido dos guiones, como límites izquierdos y derechos adicionales, antes y después de los dígitos, y la expresión modificada se habría visto así:
Circuito RegEx
jex.im visualiza expresiones regulares:
fuente
Una opción más simple es capturar los dígitos y reemplazarlos.
Recursos
fuente