Javascript正则表达式:匹配时忽略子组
我试图将字符串与中间的可选部分匹配。 示例字符串包括:Javascript正则表达式:匹配时忽略子组,javascript,regex,Javascript,Regex,我试图将字符串与中间的可选部分匹配。 示例字符串包括: 20160131_abc.pdf 20160131_abc_xx.pdf 20160131_def.pdf 结果应该包括文件名(不带可选的_xx) 到目前为止,我所拥有的: /[0-9]{8}_(abc(_xx)?|def)\.pdf/i 这种类型可以工作,但将返回第二个字符串的名称为abc\u xx——我只想要它的abc部分。是否有可能忽略子组?如果.pdf之前有def,则可以使用(?=\.pdf)前瞻来限制def部分,并添加可选组(
20160131_abc.pdf
20160131_abc_xx.pdf
20160131_def.pdf
结果应该包括文件名(不带可选的_xx)
到目前为止,我所拥有的:
/[0-9]{8}_(abc(_xx)?|def)\.pdf/i
这种类型可以工作,但将返回第二个字符串的名称为
abc\u xx
——我只想要它的abc
部分。是否有可能忽略子组?如果.pdf
之前有def
,则可以使用(?=\.pdf)
前瞻来限制def
部分,并添加可选组(?:\u xx)?
在.pdf
之前:
[0-9]{8}_(abc|def(?=\.pdf))(?:_xx)?\.pdf
见
说明:
-8位[0-9]{8}
-下划线。
-捕获组1匹配(abc|def(?=\.pdf))
或abc
(def
仅在def
紧跟其后时匹配).pdf
-可选的(?:\u xx)?
部分,如果前面有\u xx
abc
-literal\.pdf
子字符串.pdf
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/>";
});
var re=/([0-9]{8})(abc | def)(?:xx)?(\.pdf)/;
var测试=[
“20160131_abc.pdf”,
“20160131_abc_xx.pdf”,
“20160131_def.pdf”
];
var container=document.getElementById('container');
测试。forEach(功能(测试){
var匹配=测试匹配(re);
var fileName=match.slice(1.join)(“”);
container.innerHTML+=“test:”+test+“&rarr;”;
container.innerHTML+=fileName+“
”;
});
请参见如果您只是在没有正则表达式的情况下替换“xx”,会出现什么问题?然后用split,这正是我的想法。无法
my_string=my_string.replace(“\u xx”,“”)代码>做这项工作?我找到了一种方法,请检查:注意,仅在“前瞻”中检查点就足够了。是的,在“前瞻”中可以省略pdf
<代码>[0-9]{8}(abc | def(?=\)(?:\u xx)?\.pdf足够了,但增益很小。这也与20160131\u def\u xx.pdf匹配,不应该匹配