为什么JS RegEx提取多个值(只有一个匹配)

Why does JS RegEx pull multiple values (only one that matches)?

本文关键字:有一个 RegEx JS 提取 为什么      更新时间:2023-09-26

好吧,这是我完全在努力学习。。。在我的JS控制台中,为什么会发生这种情况:

"[test]".match(/'[('w+)']/)
=> ["[test]", "test"]

在上面的例子中,我只是期望"test",为什么有2个结果?

这让我感到困惑的原因是,我实际上正在尝试使用以下(相同的正则表达式,带有g修饰符)

"type[][random][][test]".match(/'[('w+)']/g)

有了以上内容,我原本希望得到的是,只知道RegEx是这样的:

["random", "test"]

考虑到上面的原始问题和控制台中的实验,我现在希望得到的是这样的东西:

["[random]", "random", "[test]", "test"]

我实际得到的是:

["[random]", "[test]"]

有人能解释为什么上面发生的事情会发生吗?


为了获得更多上下文,我试图通过查找括号中的所有单词,然后取出最后一个单词,来获得最后一组括号中的单词(即"test")。但因为我发现的行为并不是我所期望的,我基本上不得不做一些非常多余的事情,比如:

"type[][random][][test]".match(/'[('w+)']/g).slice(-1)[0].match(/'[('w+)']/).slice(-1)[0]
=> "test"

我觉得这不对

正如文档所说,它将返回以下内容:

一个数组,包含整个匹配结果和括号捕获匹配的结果,或者如果没有匹配的则为空

这就解释了你为什么会得到这个:

"[test]".match(/'[('w+)']/)
=> ["[test]", "test"]

由于正则表达式匹配括号内的任何内容([]),因此它匹配括号中的[test]test

但如果你挂上全球旗帜,再试一次:

"[test]".match(/'[('w+)']/g)
=> ["[test]"]

全局标志将使其只返回匹配项,而不返回圆括号捕获的结果。要理解,您可以查看以下内容:

"[test][test2]".match(/'[('w+)']/)
=> ["[test]", "test"]
"[test][test2]".match(/'[('w+)']/g)
=> ["[test]", "[test2]"]
相关文章: