J'ai du code HTML avant et après la chaîne:
name="some_text_0_some_text"
Je voudrais remplacer le 0
par quelque chose comme:!NEW_ID!
Alors j'ai fait une simple regex:
.*name="\w+(\d+)\w+".*
Mais je ne vois pas comment remplacer exclusivement le bloc capturé.
Existe-t-il un moyen de remplacer un résultat capturé comme ($ 1) par une autre chaîne?
Le résultat serait:
name="some_text_!NEW_ID!_some_text"
javascript
regex
Nicolas Guillaume
la source
la source
$
, de sorte que le premier mot(\w+)
est dans un groupe, et devient$1
, la partie centrale(\d+)
est le deuxième groupe, (mais obtient ignoré dans le remplacement), et le troisième groupe est$3
. Ainsi, lorsque vous donnez la chaîne de remplacement de"$1!new_ID!$3"
, les $ 1 et $ 3 sont automatiquement remplacés par le premier groupe et le troisième groupe, ce qui permet de remplacer le deuxième groupe par la nouvelle chaîne, en conservant le texte qui l'entoure.Maintenant que Javascript a regardé en arrière (à partir de ES2018 ), sur les environnements plus récents, vous pouvez éviter complètement les groupes dans des situations comme celles-ci. Au lieu de cela, regardez en arrière pour ce qui précède le groupe que vous capturiez, et cherchez à l'avance pour venir après, et remplacez par juste
!NEW_ID!
:Avec cette méthode, la correspondance complète est uniquement la partie qui doit être remplacée.
(?<=name="\w+)
- Rechercher en arrièrename"
, suivi des caractères de mots (heureusement, les regards en arrière n'ont pas à être de largeur fixe en Javascript!)\d+
- Faire correspondre un ou plusieurs chiffres - la seule partie du modèle qui ne fait pas partie d'une recherche, la seule partie de la chaîne qui sera dans la correspondance résultante(?=\w+")
- Lookahead pour les caractères de mots suivis de"
`Gardez à l'esprit que regarder en arrière est assez nouveau. Il fonctionne dans les versions modernes de V8 (y compris Chrome, Opera et Node), mais pas dans la plupart des autres environnements , du moins pas encore. Ainsi, bien que vous puissiez utiliser de manière fiable lookbehind dans Node et dans votre propre navigateur (s'il fonctionne sur une version moderne de V8), il n'est pas encore suffisamment pris en charge par des clients aléatoires (comme sur un site Web public).
la source
\d+
, non?match => match * 2
. Les chiffres sont toujours le match complet, donc pas besoin de groupesUne petite amélioration de la réponse de Matthew pourrait être une anticipation au lieu du dernier groupe de capture:
Ou vous pouvez diviser sur la décimale et rejoindre votre nouvel identifiant comme ceci:
Exemple / Benchmark ici: https://codepen.io/jogai/full/oyNXBX
la source
Avec deux groupes de capture aurait été également possible; J'aurais également inclus deux tirets, comme limites supplémentaires gauche et droite, avant et après les chiffres, et l'expression modifiée aurait ressemblé à:
Circuit RegEx
jex.im visualise les expressions régulières:
la source
Une option plus simple consiste simplement à capturer les chiffres et à les remplacer.
Ressources
la source