1
votes

Lookahead Regex. Trouver un mot sans .min. en chaîne

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.


14 commentaires

Peut-être simplement let htmlOutput = html.replace (/ \ bcommon \ .js \ b / g, common.name); ? (?! min) * js n'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 $ , utilisez common.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 .


3 Réponses :


0
votes

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é.


1 commentaires

Vous avez plutôt tort. \ bcommon [^ min] + js \ b correspond à common suivi d'un ou plusieurs caractères autres que m , i , 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



1
votes

Ici, nous pouvons probablement trouver une expression simple pour passer n'importe quel caractère sauf les nouvelles lignes et . , après le mot common , suivi de .js code>:

common([^\.]+)?\.js

Démo

Circuit RegEx

jex.im visualise les expressions régulières:


0 commentaires

2
votes

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.


0 commentaires