我试图将字符串与中间的可选部分匹配。
示例字符串是:
20160131_abc.pdf
20160131_abc_xx.pdf
20160131_def.pdf
结果应该包括文件的名称(没有可选的_xx)。
到目前为止我所拥有的:
/[0-9]{8}_(abc(_xx)?|def)\.pdf/i
这种作品但是会为第二个字符串返回abc_xx
的名称 - 我只想要它的abc
部分。是否有可能忽略该子组?
答案 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 + " → ";
container.innerHTML += fileName + "<br/>";
});
请参阅fiddle