J'ai du texte, qui contient un lien de démarque:

var text = 'some text some text [some text](link.md) some text some text';

Je veux changer cela en

var newText = 'some text some text [some text](link.html) some text some text';

En gros, changer le .md en .html, mais seulement s'il s'agit d'un lien de démarque valide. Un lien de démarque valide est []() avec du texte entre les deux.

Actuellement, je dois suivre l'expression régulière: /\[.*\]\(.*.md\)/g.

Cependant, comment vais-je effectuer un remplacement de regex en Javascript (si le regex ci-dessus correspond, remplacer .md par .html)?

2
Kevin 16 avril 2018 à 04:50

3 réponses

Meilleure réponse

Essayez ce remplacement:

var text = '[some text](link.md)';
console.log("Before:\n" + text);
text = text.replace(/(\[[^\]]+\])\(([^\)]+).md\).*/, "$1($2.html)");
console.log("After:\n" + text);
3
Tim Biegeleisen 16 avril 2018 à 02:03

Vous pouvez utiliser un lookbehind:

text.replace(/(?<=\[.*?\])\((.*)\.md\)/, "($1.html)")

Il est possible de le faire sans en capturant la première partie.

Éditer:

Il existe deux modifications mineures pour que cela fonctionne avec plusieurs éléments dans une chaîne. Tout d'abord, ajoutez l'indicateur "g" évident à l'expression régulière. Mais, deuxièmement, rendez le match capturé non gourmand:

text.replace(/(?<=\[.*?\])\((.*?)\.md\)/g, "($1.html)")

Comme d'autres l'ont souligné, vous pouvez capturer le texte entre crochets et également le remplacer, mais c'est un exemple parfait d'utilisation de lookbehinds.

0
Michael Chaney 16 avril 2018 à 14:04

Tout d'abord, vous devez utiliser le mode non gourmand *? au lieu du mode gourmand *. Ensuite, vous devez regrouper les textes et utiliser ces groupes pour générer une nouvelle URL:

str = str.replace(/\[(.*?)\]\((.*?).md\)/g, function(match, text, href) {
    return "[" + text + "](" + href + ".html)";
});

Plus court en utilisant une fonction flèche:

str = str.replace(/\[(.*?)\]\((.*?).md\)/g, (match, text, href) => 
    "[" + text + "](" + href + ".html)"
);

Exemple:

var text = '[some text](link.md)';


text = text.replace(/\[(.*?)\]\((.*?).md\)/g, (m, text, href) => "[" + text + "](" + href + ".html)");

console.log(text);
1
ibrahim mahrir 16 avril 2018 à 02:04