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

时间:2016-05-10 03:28:14

标签: javascript regex

好的,这是我完全在这里学习...在我的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"

这对我来说并不合适

1 个答案:

答案 0 :(得分:2)

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

  

包含整个匹配结果的数组   括号捕获的匹配结果,如果没有匹配则为null

这解释了为什么你会这样:

"[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]"]
相关问题