Javascript Regexp цикл все совпадения - PullRequest
37 голосов
/ 29 апреля 2011

Я пытаюсь сделать нечто подобное с помощью расширенного текстового редактора переполнения стека.Учитывая этот текст:

[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");
}

Это прекрасно работает, он предупреждает «ок» для каждого [string][int].Что мне нужно сделать, так это для каждого найденного совпадения заменить исходное совпадение компонентами второго совпадения.

Таким образом, в цикле $ 2 будет представлять часть, изначально совпадающую с int, и я выполню это регулярное выражениеpseduo)

while (arrMatch = rePattern.exec(Text)) {
    var FindIndex = $2; // This would be 1 in our example
    new RegExp("\\[" + FindIndex + "\\]\\[(.+?)\\]", "g")

    // Replace original match now with hyperlink
}

Это будет соответствовать

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

Конечный результат для первого примера будет:

<a href="http://www.example.com" rel="nofollow">Text Example</a>

Редактировать

У меня естьдошел до этого сейчас:

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)) !== null) {
  var LinkText = result[1];
  var Match = result[0];
  Text = Text.replace(new RegExp(Match, "g"), '<a href="#">" + LinkText + "</a>');
}
console.log(Text);

Ответы [ 6 ]

37 голосов
/ 29 апреля 2011

Я согласен с Джейсоном, что было бы быстрее / безопаснее использовать существующую библиотеку 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>`;
}));
33 голосов
/ 29 апреля 2011

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

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);
3 голосов
/ 14 ноября 2016

Здесь мы используем exec метод, он помогает получить все совпадения (с помощью цикла 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 
0 голосов
/ 05 августа 2018

Другой способ перебора всех совпадений без использования exec и тонкостей сопоставления - использование функции замены строк с использованием регулярного выражения в качестве первого параметра и функции в качестве второго. При таком использовании аргумент функции получает полное совпадение в качестве первого параметра, сгруппированные совпадения в качестве следующих параметров и индекс в качестве последнего:

var text = "[Text Example][1]\n[1][http: //www.example.com]";
// Find resource links
var arrMatch = null;
var rePattern = new RegExp("\\[(.+?)\\]\\[([0-9]+)\\]", "gi");
text.replace(rePattern, function(match, g1, g2, index){
    // Do whatever
})

Вы можете даже выполнять итерации по всем группам каждого совпадения, используя глобальную переменную JS arguments, за исключением первой и последней.

0 голосов
/ 16 августа 2016

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

[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);
0 голосов
/ 29 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...