JavaScript中的一个简单的正则表达式匹配问题?

新手上路,请多包涵

使用正则去匹配[00:00.92]这样的字符串

        let timeReg = /\[(\d*:\d*\.\d*)\]/;
        let str = "[00:00.92]";
        let res = timeReg.exec(str);
        console.log(res);

正则中加() res输出为
0: "[00:00.92]"
1: "00:00.92"
为什么匹配出两个?
不加(),则只匹配一个
0: "[00:00.92]" ?

这是为什么?而用一些正则测试的网站,无论是否加()都只匹配一个[00:00.92]?

阅读 1.4k
2 个回答

一个 () 是一个捕获组,用于将某个子串获取出来以备后续使用

js 正则 exec 的匹配结果第一个是完整匹配,后面是从左往右的每个捕获组

如匹配 [00:00.92] 中的 0000.92,可以这样写

/\[(\d*):(\d*\.\d*)\]/.exec("[00:00.92]") // ['[00:00.92]', '00', '00.92']

如果只想用括号,但不想获取出来,怎么办?用 (?:pattern) 转为非捕获组

/\[(?:\d*:\d*\.\d*)\]/.exec("[00:00.92]") // ['[00:00.92]']

这里你有多个疑问,一一为你解答。
1,匹配两个:第一个是完整匹配结果,第二个是分组结果。
正则中,如果存在()这种分组,会在结果中单独列出一个匹配值。

2,一些正则网站只匹配一个。正则是贪婪匹配,在你所提供的字符集中,的的确确只有一个贪婪匹配后的结果。而你看到的匹配出两个,那是结果集中的一个子项分组。

例如:

[00:00.92][00:00.93]

如果你想匹配分组中的内容,需要这么写:

let reg = /(?!\[)\d*:\d*\.\d*(?=\])/
// ["00:00.92"]

这是正则的零宽断言

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题