用正则表达式替换文本中的多个字符串

Replace multiple strings in text with reg ex

我有一些文字带有 [cid:ce743cbf-8c44-4c84-aa72-6d2c9eb4b81a] 标签(内联附件)

我需要浏览文本并将其替换为文件链接。 所以我需要将实际标签与括号匹配,并记住其中的 UUID 作为参数提供给替换函数。

所以给定字符串

var str = "some text 1 [cid:12345] more text follows 2 [cid:6789] last text"

我正在尝试用这个测试替换它,但它甚至没有正确匹配。

str.replace(/\[cid:(.+)\]/gm, function(m,p){return p})

我不太了解正则表达式,请帮忙。我认为这与贪婪有关,因为它消耗了第一场比赛和最后一场比赛之间的一切。

谢谢。

+ 是一个 greedy 运算符,这意味着它将尽可能多地匹配,并且仍然允许匹配正则表达式的其余部分。使用 +? 表示非贪婪匹配,意思是 "one or more — preferably as few as possible"。

/\[cid:(.+?)]/g

注意:可以去掉m(多行)修饰符,这里用无意义。

是的,你是对的,这与贪婪有关。 .+ 部分会将所有内容匹配到字符串的末尾,然后开始回溯以匹配括号,找到字符串中的最后一个括号。

.+ 之后添加 ? 将使其成为非贪婪的:

var str = "some text 1 [cid:12345] more text follows 2 [cid:6789] last text"

str = str.replace(/\[cid:(.+?)\]/gm, function(m,p){return p});

// show in Whosebug snippet
document.write(str);

另一种方法是匹配除右括号外的所有内容:

str = str.replace(/\[cid:([^\]]+)\]/gm, function(m,p){return p});