Regex将标记图像模式与给定的文件名相匹配

Regex to match markdown image pattern with the given filename

本文关键字:文件名 图像 模式 Regex      更新时间:2023-09-26

我想用一个空字符串替换文本区域中给定文件名的markdown图像模式。

所以图案是![alt](http://somehost/uploads/filename.jpg)

这是我现在的代码:

var content = target.val();
var fileName = someDynamicValue;
var regex = new RegExp(RegExp.escape('![') + '.*' + RegExp.escape(']') + RegExp.escape('(') + '.*' + RegExp.escape(fileName) + RegExp.escape(')'), 'i');
var found = regex.exec(content);
var newContent = content.replace(regex, "");
target.val(newContent);
RegExp.escape= function(s) {
    return s.replace(/[-'/''^$*+?.()|[']{}]/g, '''$&')
};

例如CCD_ 2。然后我需要匹配![alt](http://somehost/uploads/filename.jpg)并用一个空字符串替换它。

如果content包含一个图像,则一切都很好。但如果不止一个,例如:

一些文本![alt](http://somehost/uploads/filename.jpg)一些文本![alt2](http://somehost/uploads/filename2.jpg)更多的文本。

var found包括![alt](http://somehost/uploads/filename.jpg)![alt2](http://somehost/uploads/filename2.jpg),但我只需要匹配![alt](http://somehost/uploads/filename.jpg)

在这种情况下,我需要什么正则表达式?

使用非贪婪量词即可:

!'[(.*?)']'((.*?)')

您可以在线查看:https://regex101.com/r/kfi8qI

不确定如何将字符串组合在一起,但
'.*'贪婪地匹配到最后一个文件名
所以,它可能应该是'.*?'

但是,如果文件名不同,则不应该匹配
另一件事是,您通常应该用
阻止它超过下一个[alt]类似'[^'[']]*'

编辑:

RegExp.sescape('![')+'.*'+RegExp.sEscape(']')+RegExp.eescape;

是罪魁祸首。

尝试

RegExp.escape('![') + '[^']]*' + RegExp.escape(']') + RegExp.escape('(') + '[^'[']]*?' + RegExp.escape(fileName) + RegExp.escape(')'), 'i');