Javascript Regex:匹配时忽略子组

时间:2016-04-14 09:37:04

标签: javascript regex

我试图将字符串与中间的可选部分匹配。

示例字符串是:

20160131_abc.pdf
20160131_abc_xx.pdf
20160131_def.pdf

结果应该包括文件的名称(没有可选的_xx)。

到目前为止我所拥有的:

/[0-9]{8}_(abc(_xx)?|def)\.pdf/i

这种作品但是会为第二个字符串返回abc_xx的名称 - 我只想要它的abc部分。是否有可能忽略该子组?

2 个答案:

答案 0 :(得分:1)

如果在def之前(?=\.pdf) .pdf,您可以使用def前瞻限制def部分.pdf。 1}} (?:_xx)?之前添加可选组.pdf

[0-9]{8}_(abc|def(?=\.pdf))(?:_xx)?\.pdf

请参阅regex demo

<强>解释

  • [0-9]{8} - 8位数字
  • _ - 下划线
  • (abc|def(?=\.pdf)) - 匹配{1}}或abc的匹配组1(def仅在def紧随其后才匹配)
  • .pdf - 可选的(?:_xx)?部分只有在_xx
  • 之前才会出现在匹配中(不在捕获中)
  • abc - 文字\.pdf substring

答案 1 :(得分:0)

你可以在正则表达式中使用非捕获组,然后&#34; implode&#34;比赛结果:

var re = /([0-9]{8}_)(abc|def)(?:_xx)?(\.pdf)/;
var tests = [
  '20160131_abc.pdf',
  '20160131_abc_xx.pdf',
  '20160131_def.pdf'
];
var container = document.getElementById('container');
tests.forEach(function(test){
  var match = test.match(re);
  var fileName = match.slice(1).join('');
  container.innerHTML += "test:" + test + " &rarr; ";
  container.innerHTML += fileName + "<br/>";
});

请参阅fiddle