好的,这是我完全在这里学习...在我的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"
这对我来说并不合适
答案 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]"]