JavaScript RegExp:匹配,但不要't捕获

JavaScript RegExp: match, but don't capture

本文关键字:捕获 RegExp 匹配 JavaScript      更新时间:2023-09-26

SO上有一千个正则表达式问题,如果已经涉及到了,我很抱歉。我确实先看了看。

给定以下模式:

(?:/|-)[0-9]{2}$

以及以下字符串:

str1 = '65/65/65'
str2 = '65/65/6565'

匹配项为:

str1 = '/65' // expected '65'
str2 = ''    // as I expected

我对的意图?:是匹配的,但不包括/-。满足我期望的正确正则表达式是什么?

由于Javascript中没有后备功能,只需将所需的部分封装到一个捕获组中即可:

var str =  '65/66/67';
if(res = str.match(/(?:'/|-)([0-9]{2})$/)) {
  console.log(res[1]);
}

参见小提琴

注意:(?:'/|-)可以替换为字符类['/-],如@anubhava所评论的。

通常情况下,这将通过一个后备:来完成

/(?<=[-'/])[0-9]{2}$/

遗憾的是,JavaScript不支持这些功能。

相反,由于您知道"额外位"的长度(即一个字符,-/),因此它应该足够简单,只需.substr(1)即可。

没有后备,但有排他性匹配(?:),因为它不会失败。问题是,它将作为整体匹配的一部分(结果的索引0)。因此,最好的选择是捕获你想要的部分。在您的示例中,这可以通过将匹配的数字括在括号中来完成。

var re   = /(?:[/-])([0-9]{2})$/,
    str1 = '12/34/56',
    str2 = '12/34/5678';
var res1 = str1.match(re);  // will want to use res1[1], not res1[0]  
var res2 = str2.match(re);  // null returned