Javascript Regexp循环所有匹配项

Javascript Regexp循环所有匹配项,javascript,regex,loops,match,Javascript,Regex,Loops,Match,我正在尝试使用stack overflow的富文本编辑器做类似的事情。鉴于这一案文: [Text Example][1] [1][http://www.example.com] 我想通过以下方式循环找到的每个[string][int]: var Text=“[Text-Example][1]\n[1][http://www.Example.com]”; //查找资源链接 var arrMatch=null; var rePattern=new RegExp( "\\[(.+?)\\]\\[

我正在尝试使用stack overflow的富文本编辑器做类似的事情。鉴于这一案文:

[Text Example][1]

[1][http://www.example.com]
我想通过以下方式循环找到的每个
[string][int]

var Text=“[Text-Example][1]\n[1][http://www.Example.com]”;
//查找资源链接
var arrMatch=null;
var rePattern=new RegExp(
"\\[(.+?)\\]\\[([0-9]+)\\]",
“gi”
);
while(arrMatch=rePattern.exec(Text)){
控制台日志(“ok”);

}
此格式基于。有很多可用的。如果您不想要完整的语法,那么我建议您窃取与链接相关的部分。

我同意Jason的观点,即使用现有的标记库会更快/更安全,但您正在寻找(也可以使用RegExp文本!):

var Text=“[Text-Example][1]\n[1][http://www.Example.com]”;
var rePattern=/\[(.+?)\]\[([0-9]+)\]/gi;
console.log(Text.replace)(重模式,函数(匹配,文本,urlId){
//返回格式正确的链接
返回``;

}));我最终成功地做到了这一点:

var Text=“[Text-Example][1]\n[1][http://www.Example.com]”;
//查找资源链接
reg=新的RegExp(
"\\[(.+?)\\]\\[([0-9]+)\\]",
“gi”);
var结果;
while(结果=reg.exec(文本)){
var LinkText=结果[1];
var匹配=结果[0];
var LinkID=result[2];
var FoundURL=new RegExp(“\\[”+LinkID+“\\]\\[(.+?)\\]”,“g”).exec(文本);
Text=Text.replace(匹配“”);
}

console.log(文本)使用反向引用限制匹配,以便在以下情况下代码将匹配:

[Text Example][1]\n[1][http://www.example.com]
[Text Example][1]\n[2][http://www.example.com]
如果您的文本为:

[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='[文本示例][1]\n[1][http://www.example.com]';
var subst='';
var结果=str.replace(re,subst);

console.log(result);
这里我们使用的是exec方法,它有助于获取所有匹配项(使用help 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 

在不依赖exec和match细节的情况下迭代所有匹配的另一种方法是使用字符串替换函数,使用正则表达式作为第一个参数,使用函数作为第二个参数e最后一项:

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
迭代每个匹配的所有组,不包括第一个和最后一个。

我知道它很旧,但由于我偶然发现了这篇文章,我想把事情搞清楚

首先,你解决这个问题的思维方式太复杂了,当本应是简单问题的解决变得太复杂时,是时候停下来想想哪里出了问题。 第二,您的解决方案在某种程度上是超低效的,您首先尝试查找要替换的内容,然后尝试在同一文本中搜索引用的链接信息。因此计算复杂性最终变成
O(n^2)

看到这么多人在错误的问题上投赞成票,这是非常令人失望的,因为来到这里的人们大多从公认的解决方案中学习,认为这似乎是正确的答案,并在他们的项目中使用这个概念,然后变成了一个非常糟糕的实施产品

解决这个问题的方法非常简单。你所需要做的就是找到文本中所有引用的链接,将它们保存为字典,然后使用字典搜索要替换的占位符。就是这样。它太简单了!在这种情况下,你只需
O(n)

正确答案是:

const text=`
[2][https://en.wikipedia.org/wiki/Scientific_journal][5][https://en.wikipedia.org/wiki/Herpetology]
Wells and Wellington事件是关于1983年和1985年在澳大利亚[爬虫学][5]杂志上发表的三篇论文的争议。该出版物成立于1981年,是一份[同行评议][1][科学期刊][2],专注于[3]的研究[https://en.wikipedia.org/wiki/Amphibian][两栖动物][3]及[爬行动物][4]([爬虫学][5])它的前两个问题是在澳大利亚新英格兰大学的一年级生物系学生Richard W. Wells的编辑下发表的。威尔斯在1983和1985年间突然发表了三篇论文而没有同行评议。在高中教师克里夫·罗斯·惠灵顿(Cliff Ross Wellington)的演讲中,论文重新整理了澳大利亚和新西兰所有[两栖动物][3]和[爬行动物][4]的分类,并提议对该地区的爬虫纲二项命名法进行700多处修改。
[1][https://en.wikipedia.org/wiki/Academic_peer_review]    
[4][https://en.wikipedia.org/wiki/Reptile]          
`;
常量linkRefs={};
常量linkRefPattern=/\[(?\d+)\]\[(?[^\]]+)\]//g;
常量链接占位符模式=/\[(?[^\]]+)\]\[(?\d+)\]/g;
const parsedText=text
.replace(linkRefPattern,(…[,,,,ref])=>(linkRefs[ref.id]=ref.link,))
.replace(linkplaceholder模式,(…[,,,,placeholder])=>`)
.trim();

log(parsedText)谢谢,我想学习如何做到这一点,但我一直在搜索谷歌如何循环每一场比赛,并做另一场比赛。足够公平。看起来其他一些答案提供了代码。这真的很有用。