我想在保留文件扩展名的同时从数组中的所有元素中删除ISO代码和前导下划线。 ISO代码始终位于文件扩展名之前。
源数组:
var SrcFiles = [
"File_with_nr1_EN.txt",
"File_has_NR_3_ZHHK.txt",
"File_yy_nr_2_DE.pdf"
];
我希望它看起来像这样:
var SrcFiles = [
"File_with_nr1.txt",
"File_has_NR_3.txt",
"File_yy_nr_2.pdf"
];
我该如何解决这个问题?可能与正则表达式,但如何?我找到了一个很好的正则表达式,只匹配文件结尾,但不知道这对我有什么帮助。
const re = /(?:\.([^.]+))?$/;
答案 0 :(得分:3)
查找_
后跟任何非_
([^_]
)的内容,然后是: a .
后跟任何内容最后为_
($
)。 粗体中的部分应被捕获为$1
。
var SrcFiles = [
"File_with_nr1_EN.txt",
"File_has_NR_3_ZHHK.txt",
"File_yy_nr_2_DE.pdf"
];
var re = /_[^_]+(\.[^_]+)$/;
console.log(SrcFiles.map(f => f.replace(re, "$1")));
答案 1 :(得分:1)
您可以捕获所有最后一个_
,匹配_
和1+大写字母,然后捕获一个点以及随后的1个字符而不是一个点直到字符串的结尾:
/^(.*)_[A-Z]+(\.[^.]+)$/
并替换为$1$2
,其中$1
是对第1组的反向引用,$2
是指第2组中的值。
[A-Z]+
可以增强到[A-Z]{2,}
(因为ISO代码通常至少包含2个字符),如果连字符可以显示在那里,请使用_[A-Z-]{2,}
。
参见JS演示:
var SrcFiles = [
"File_with_nr1_EN.txt",
"File_has_NR_3_ZHHK.txt",
"File_yy_nr_2_DE.pdf"
];
var res = SrcFiles.map(x => x.replace(/^(.*)_[A-Z]+(\.[^.]+)$/, '$1$2'));
// ES5
//var res = SrcFiles.map(function(x) {return x.replace(/^(.*)_[A-Z]+(\.[^.]+)$/, '$1$2'); });
console.log(res);

答案 2 :(得分:1)
正则表达式:
("^_)*_[A-Z]+(\.[^.]+",?)
换人:
$1$2
结帐https://regex101.com/r/h0gukN/2
我在ISO字符串之前加入了部分,其余部分加在一起。 希望它有所帮助:P
答案 3 :(得分:1)
Te模式并不那么困难。看看:
1_EN.txt
代表以下模式:\d+_\S+.
,其中您要删除_\S+
。然后,您可以使用以下替换模式实现此目的:
s/(\d+)_\S+\./$1./g
第一组,后跟“点”是您要保留在文本中的内容。 'g'约束意味着您希望继续替换文本中所有其他匹配的模式。
结果详情:
1_EN。换成1。
1.1。组:1
3_ZHHK。换成3。
2.1。组:3
2_DE。换成2。
3.1。组:2