我编写了一个JavaScript代码,用于替换(删除(文件名的一些单词、字符、数字和扩展名。到目前为止,我只能使用以下代码删除文件名的扩展名:
fileName = fileName.replace(/(?:.[^.]*$|$)/, '');
我有如下文件名:
2.5_TR125_10x10.jpg
AB1_TR3201_50x50.png
我只想保留TR部分并删除
2.5_ and _10x10.jpg
AB1_ and _50x50.png
我试图在上面的代码中包含介于((之间的这些单词,但没有成功。
任何想法如何将这些单词包括在要删除的列表中
您说要保留TR
部分,所以TR
子字符串在一个下划线之后,直到下一个下划线。
您可以String#match()
提取它:
const strs = ['2.5_TR125_10x10.jpg','AB1_TR3201_50x50.png'];
const regex = /_(TR[^_]*)/;
for (const s of strs) {
console.log(s, '=>', s.match(regex)?.[1]);
}
这里,_(TR[^_]*)
匹配_
,然后将TR
子字符串和除下划线以外的任何零个或多个字符捕获到组1中。
如果您计划使用单独的regexp删除字符串的部分,则效率会降低。比方说,如果您想在当前正则表达式的基础上构建String#replace
(请注意,$
替代项应该被删除,用空字符串替换字符串末尾位置(空字符串(是没有意义的,而(?:.[^.]*$|$)
模式实际上是.[^.]*$
(,那么您应该使用
const remove_patterns = [String.raw`^[^_]*_`, String.raw`_d+xd+`, String.raw`.[^.]*$`];
const regex = new RegExp(remove_patterns.join('|'), 'g');
const strs = ['2.5_TR125_10x10.jpg','AB1_TR3201_50x50.png'];
for (const s of strs) {
console.log(s, '=>', s.replace(regex, ''));
}
在这里,以下模式匹配的所有出现都将被删除:
^[^_]*_
-字符串的开头,除_
和_
之外的零个或多个字符_d+xd+
-_
,一个或多个数字,x
,一个或者多个数字.[^.]*$
-一个点,零个或多个字符,而不是一个点和字符串的末尾