J'essaye de remplacer un lien dans un fichier html par regex et nodejs. Je souhaite remplacer les liens sans extension .min.js.
Par exemple, il doit correspondre à "common.js" mais pas à "common.min.js"
Voici ce que j'ai essayé:
let htmlOutput = html.replace(/common\.(?!min)*js/g, common.name);
Je pense que cette anticipation négative devrait fonctionner mais elle ne correspond à rien. Toute aide serait appréciée.
3 Réponses :
La regex de fin que j'utilise est /\bcommon[^minITED+js\b/g
Cela trouvera le mot commun avec n'importe quel nombre de caractères après le mot sauf si ces caractères contiennent le mot min et se terminant par js me permettant de remplacer les scripts sur ma page html comme:
script src = "~ / dist / common.js"
OU
script src = "~ / dist / common.9cf5748e0e7fc2928a07.js"
Merci à Wiktor Stribiżew de m'avoir aidé.
Vous avez plutôt tort. \ bcommon [^ min] + js \ b correspond à common suivi d'un ou plusieurs caractères autres que m , i code >, n suivi de la sous-chaîne js . Vous avez donc besoin de \ bcommon (? :( ?! min).) *? Js \ b Je suppose, à en juger par votre description. Ou \ bcommon \ b (?! \ S * \. Min \ .js \ b) \ S * \. Js \ b
La partie (?! min) * js est corrompue: vous ne devez pas quantifier les assertions de largeur nulle comme les lookaheads (elles ne consomment pas de texte donc les quantificateurs après eux sont traités comme des erreurs de l'utilisateur ou sont ignoré). Puisque js ne commence pas par min , cette anticipation même sans quantificateur est redondante.
Si vous voulez faire correspondre une chaîne avec un mot entier common code>, puis ayant tous les caractères et se terminant par .js mais pas .min.js dont vous avez besoin
/\bcommon\b(?!.*\.min\.js$).*\.js$/
Voir la démo regex .
Détails :
\ b - limite de mot common - une sous-chaîne \ b - limite de mot (?!. * \. min \ .js $) - immédiatement à droite, il ne devrait pas y avoir de caractères 0 ou plus suivis de .min.js code > à la fin de la chaîne . * - 0 ou plusieurs caractères \ .js - une sous-chaîne .js $ - fin de chaîne.
Peut-être simplement
let htmlOutput = html.replace (/ \ bcommon \ .js \ b / g, common.name);?(?! min) * jsn'a aucun sens.@ WiktorStribiżew ne semble pas fonctionner.
Cela fonctionne . Voir également jsfiddle.net/wxvL9m7p
@ WiktorStribiżew Confus. Ce doit être un autre problème empêchant un match. Je vais jeter un oeil et vous recontacter.
Que contient
common.name, BTW?C'est de WebPack. Une chaîne contenant le nom de fichier js avec un contenthash généré pour le contournement du cache
Ok, s'il peut contenir
$, utilisezcommon.name.replace (/ \ $ / g, '$$$$'). Mais vous devriez vérifier ce que vous faites car l'expression régulière que j'ai partagée doit fonctionner.Votre regex est correcte mais elle ne remplace toujours pas la chaîne dans mon html. Pas certain de pourquoi. Je vais faire quelques tests
Êtes-vous sûr d'attribuer la nouvelle valeur après le remplacement à la variable?
Il s'avère que c'était un problème d'affectation avec ma variable de fichier. Fonctionne parfaitement maintenant. Merci beaucoup
Quelqu'un voudra-t-il formuler une réponse appropriée, s'il vous plaît? :) Pour que nous puissions voter ...
@ WiktorStribiżew Pardon, puis-je demander de l'aide à nouveau? Le regex ne répond pas entièrement à mon cas d'utilisation. La recherche du mot «common.js» fonctionnera la première fois. Comment rechercher la deuxième fois lorsque la chaîne ressemblera à «common.9132423487928.js»? J'ai essayé. * Ce qui m'a amené, de manière prévisible, commun.345345345.js et common.456456456.min.js
Je l'ai trouvé. Je publierai une réponse ci-dessous en vous créditant @ WiktorStribiżew
@virolino J'ai publié la bonne réponse .