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");
}
Ответы
Ответ 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);