RegEx:删除所有(包括)最后一个下划线和文件扩展名之间的所有内容

时间:2017-04-16 19:07:22

标签: javascript regex

我想在保留文件扩展名的同时从数组中的所有元素中删除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 = /(?:\.([^.]+))?$/;

4 个答案:

答案 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")));

REGEX101 DEMO

答案 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. 1_EN。换成1。

    1.1。组:1

  2. 3_ZHHK。换成3。

    2.1。组:3

  3. 2_DE。换成2。

    3.1。组:2