Обновить hrefs в ссылках markdown

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Я понимаю, что это тривиальный вопрос регулярного выражения. Но, возможно, это было бы полезно не только для меня.

У меня есть файл markdown, и мне нужно обновить его ссылки. Ссылка Markdown имеет формат [TITLE](HREF) . У меня есть шаблон, /[*](.*?)/ но он возвращает неверный результат ](HREF) .

 const line = 'Markdown text [link title](/link/href/name.md#anchor)'
const res = line.match(/[*](.*?)/gm);
console.log(res);  
     

Итак, как получить просто HREF (в примере это было бы /link/href/name.md#anchor )

Комментарии:

1. Вы можете использовать /[[^][]*]([^()]*)/g

2. Что вы ожидаете, что это вернет?!

3. Спасибо, но /[[^][]*]([^()]*)/ возвращает все [link title](/link/href/name.md#anchor) . но мне нужно только /link/href/name.md#anchor

4. Захватите эту часть — /[[^][]*](([^()]*))/g и получите значение группы 1.

5. Я не совсем уверен, что вы имеете в виду, говоря «обновить его ссылки», но лучшим подходом может быть использование реального анализатора / процессора markdown, такого как remark: remark.js.org . Это также может иметь дело с такими случаями, как экранирование [ ] в тексте заголовка.

Ответ №1:

Вы можете использовать

 const line = 'Markdown text [link title](/link/href/name.md#anchor)'
const reg = /[[^][]*](([^()]*))/g;
let m, res = [];
while (m = reg.exec(line)) {
    res.push(m[1]);
}
console.log(res);  

/[[^][]*](([^()]*))/g Регулярное выражение соответствует:

  • [ [ символ
  • [^][]* — 0 или более символов, отличных от [ и ]
  • ] ] символ
  • ( ( символ
  • ([^()]*) — Группа 1: любые символы 0 , отличные от ( и )
  • ) ) символ.

С последними реализациями ECMAScript вы можете использовать

 const line = 'Markdown text [link title](/link/href/name.md#anchor)'
console.log(line.match( /(?<=[[^][]*]()[^()]*(?=))/g ));  

Ответ №2:

Вы могли бы использовать этот шаблон: ([^)] )$

( — совпадение ( буквально

[^)] сопоставьте один или несколько символов, отличных от )

) — совпадение ) буквально

$ — сопоставить конец строки

ДЕМОНСТРАЦИЯ

Комментарии:

1. Это не то, что мне нужно, потому что можно поймать только текст в скобках, а не ссылку md

2. @FranzJsel Это соответствует ссылке 🙂 Если это всегда в конце, оно не будет соответствовать никакому другому тексту в скобках — смотрите демонстрацию 🙂