Подтвердить что ты не робот

Javascript Regexp петля все совпадения

Я пытаюсь сделать что-то подобное с текстовым редактором с переполнением стека. С учетом этого текста:

[Text Example][1]

[1][http://www.example.com]

Я хочу зациклять каждый [string][int], который найден таким образом:

var Text = "[Text Example][1]\n[1][http: //www.example.com]";
// Find resource links
var arrMatch = null;
var rePattern = new RegExp(
  "\\[(.+?)\\]\\[([0-9]+)\\]",
  "gi"
);
while (arrMatch = rePattern.exec(Text)) {
  console.log("ok");
}
4b9b3361

Ответ 1

Мне удалось это сделать в конце:

var Text = "[Text Example][1]\n[1][http: //www.example.com]";
// Find resource links
reg = new RegExp(
  "\\[(.+?)\\]\\[([0-9]+)\\]",
  "gi");
var result;
while (result = reg.exec(Text)) {
  var LinkText = result[1];
  var Match = result[0];
  var LinkID = result[2];
  var FoundURL = new RegExp("\\[" + LinkID + "\\]\\[(.+?)\\]", "g").exec(Text);
  Text = Text.replace(Match, '<a href="' + FoundURL[1] + '" rel="nofollow">' + LinkText + '</a>');
}
console.log(Text);

Ответ 2

Я согласен с Джейсоном в том, что более быстрая/безопасная работа с существующей библиотекой Markdown, но вы ищете String.prototype.replace (также, используйте литералы RegExp!):

var Text = "[Text Example][1]\n[1][http: //www.example.com]";
var rePattern = /\[(.+?)\]\[([0-9]+)\]/gi;

console.log(Text.replace(rePattern, function(match, text, urlId) {
  // return an appropriately-formatted link
  return `<a href="${urlId}">${text}</a>`;
}));

Ответ 3

Здесь мы используем метод exec, он помогает получить все совпадения (с помощью while while) и получить позицию согласованной строки.

    var input = "A 3 numbers in 333";
    var regExp = /\b(\d+)\b/g, match;
    while (match = regExp.exec(input))
      console.log("Found", match[1], "at", match.index);
    // → Found 3 at 2 //   Found 333 at 15 

Ответ 4

Этот формат основан на Markdown. Существует несколько портов JavaScript. Если вам не нужен весь синтаксис, я рекомендую украсть части, связанные со ссылками.

Ответ 5

Вот небольшой пример, надеюсь, вы сможете найти полезный. \number используется в regex для обозначения номера совпадения групп, а $number используется в функции replace для ссылки на результаты группы, поэтому вы можете принудительно установить, что числа будут одинаковыми с чем-то подобным, если ваш текст

[Text Example][1]\n[1][http://www.example.com]

он будет соответствовать, и если он

[Text Example][1]\n[2][http://www.example.com]

он не будет

var re = /\[(.+?)\]\[([0-9]+)\s*.*\s*\[(\2)\]\[(.+?)\]/gi;
var str = '[Text Example][1]\n[1][http://www.example.com]';
var subst = '<a href="$4">$1</a>';

var result = str.replace(re, subst);
console.log(result);