JavaScript的正则expression式循环所有匹配

我试图用堆栈溢出的富文本编辑器做类似的事情。 给出这个文本:

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

我想循环每个[string][int]find我这样做:

 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] “ok”。 我需要做的,是find每场比赛,用第二场比赛的组成部分取代最初的比赛。

所以在循环$ 2将代表最初匹配的int部分,我会运行这个正则expression式(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); 

我同意Jason的看法:使用现有的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>`; })); 

我最终设法做到这一点:

 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); 

这里我们使用exec方法,它有助于获得所有匹配(带有while循环的帮助)并获取匹配string的位置。

  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 

这种格式基于Markdown 。 有几个JavaScript端口可用。 如果你不想要完整的语法,那么我build议你去窃取与链接相关的部分。

这是一个小例子,我希望你能find有用的。 \number是在正则expression式引用组匹配号码和$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);