正则表达式不包括下划线,但仅当下划线位于数字或大写字母之前时?

时间:2018-08-29 12:35:32

标签: regex regex-negation

我有一个字符串,表示包含合并的业务部门代码和时间戳的文件名,例如: alfin_cf_cashflowcomposition_X0826_20180726122003.csv

我想排除BU代码和时间戳,并以剥离的名称结尾,所以我要获得此名称: alfin_cf_cashflowcomposition.csv

到目前为止,我已经设法只匹配小写字母,点和下划线(因此,不包括大写X和代表时间戳的数字)。

我使用了一个简单的表达式: / [a-z ._] ,并得到了以下结果: alfin_cf_cashflowcomposition __。csv

请注意,“。csv”之前有2个下划线。我不想在那里。

如果下一个字符是小写字母,我只想使用下划线。

如果下一个字符是大写字母或数字,我需要编写一个忽略下划线的正则表达式。

关于如何实现这一目标的任何想法吗?

2 个答案:

答案 0 :(得分:0)

我不会为此使用正则表达式。您可以去除扩展名,分割文件名的其余部分,并使用除最后两个部分以外的所有部分。

我用javascript实现了这个简单的代码。

const orig_filename = "alfin_cf_cashflowcomposition_X0826_20180726122003.csv";

function strip_codes (orig){
  const extpos = orig.lastIndexOf('.');
  const nameparts = orig.substr(0,extpos).split('_');
  const ext = orig.substr(extpos);
  const name = nameparts
    .slice(0, nameparts.length - 2)
    .join('_');
  return name + ext;
}

console.log(strip_codes(orig_filename));

答案 1 :(得分:0)

您可以使用_.[A-Z,0-9].*(?=.csv)这个正则表达式起作用。 您可以在这里在线进行测试https://regexr.com/