Eu tenho código HTML antes e depois da string:
name="some_text_0_some_text"
Gostaria de substituir o 0
por algo como:!NEW_ID!
Então eu fiz um regex simples:
.*name="\w+(\d+)\w+".*
Mas não vejo como substituir exclusivamente o bloco capturado.
Existe uma maneira de substituir um resultado capturado como ($ 1) por alguma outra string?
O resultado seria:
name="some_text_!NEW_ID!_some_text"
javascript
regex
Nicolas Guillaume
fonte
fonte
$
, de modo que a primeira palavra(\w+)
está em um grupo e se torna$1
, a parte do meio(\d+)
é o segundo grupo (mas obtém ignorado na substituição) e o terceiro grupo é$3
. Portanto, quando você fornece a sequência de substituição de"$1!new_ID!$3"
, $ 1 e $ 3 são substituídos automaticamente pelo primeiro e pelo terceiro grupo, permitindo que o segundo grupo seja substituído pela nova sequência, mantendo o texto ao seu redor.Agora que o Javascript olhou para trás (a partir do ES2018 ), em ambientes mais novos, é possível evitar grupos inteiramente em situações como estas. Em vez disso, preste atenção no que vem antes do grupo que você estava capturando, e procure logo depois, e substitua por apenas
!NEW_ID!
:Com esse método, a correspondência completa é apenas a parte que precisa ser substituída.
(?<=name="\w+)
- Lookbehindname"
, seguido por caracteres de palavra (felizmente, lookbehinds não precisa ter largura fixa em Javascript!)\d+
- Corresponde a um ou mais dígitos - a única parte do padrão que não está em uma visão geral, a única parte da sequência que estará na correspondência resultante(?=\w+")
- Procure por caracteres de palavras seguidos por"
`Lembre-se de que olhar para trás é muito novo. Ele funciona nas versões modernas do V8 (incluindo Chrome, Opera e Node), mas não na maioria dos outros ambientes , pelo menos ainda não. Portanto, embora você possa usar o lookbehind de forma confiável no Node e em seu próprio navegador (se ele for executado em uma versão moderna do V8), ele ainda não é suficientemente suportado por clientes aleatórios (como em um site público).
fonte
\d+
, certo?match => match * 2
. Os dígitos ainda são a partida inteira, então não há necessidade de gruposUm pequeno aprimoramento na resposta de Matthew poderia ser um olhar atento, em vez do último grupo de captura:
Ou você pode dividir no decimal e associar-se ao seu novo ID assim:
Exemplo / Referência aqui: https://codepen.io/jogai/full/oyNXBX
fonte
Com dois grupos de captura também teria sido possível; Eu também incluiria dois traços, como limites esquerdo e direito adicionais, antes e depois dos dígitos, e a expressão modificada teria a seguinte aparência:
Circuito RegEx
O jex.im visualiza expressões regulares:
fonte
Uma opção mais simples é capturar os dígitos e substituí-los.
Recursos
fonte