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

说明

  • [0-9]{8}
    -8位
  • -下划线
  • (abc|def(?=\.pdf))
    -捕获组1匹配
    abc
    def
    def
    仅在
    .pdf
    紧跟其后时匹配)
  • (?:\u xx)?
    -可选的
    \u xx
    部分,如果前面有
    abc
  • \.pdf
    -literal
    .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匹配,不应该匹配