我一直在尝试创建一个与函数参数匹配的正则表达式。
以下是完整示例(使用调试模式):https://regex101.com/r/vM7xN1/1
我目前拥有的正则表达式是:\(([^,\s\)]+)(?:\s*,\s*([^,\s\)]+))*\)
比赛结果我试图实现:
1. someFunc(param) => ['param']
2. someFunc(param, param2) => ['param', 'param2']
3. someFunc(param, param2, param3) => ['param', 'param2', 'param3']
4. someFunc(param, param2, param3, param4) => ['param', 'param2', 'param3', 'param4']
出于某种原因,这只能正确地匹配1,2个函数。在函数3和4中,它只匹配第一个参数和最后一个参数。
为什么它会跳过第一个和最后一个之间的参数?
修改 附加测试:
'myFunction(param1, param2, param3)'.match(/(([^,\s)]+)(?:\s*,\s*([^,\s)]+))*)/) => ["(param1, param2, param3)", "param1", "param3"]
在没有非捕获组的情况下尝试时,我得到了这个:
'myFunction(param1, param2, param3)'.match(/(([^,\s)]+)(\s*,\s*([^,\s)]+))*)/) => ["(param1, param2, param3)", "param1", ", param3", "param3"]
任何帮助都会很棒。
谢谢!
答案 0 :(得分:2)
只需使用一个简单的正则表达式来获取圆括号之间的所有内容并以逗号分隔:
>"someFunc(param, param2, param3, param4)".match(/(?:\()(.+)+(?:\))/)
["(param, param2, param3, param4)", "param, param2, param3, param4"]
>"someFunc(param, param2, param3, param4)".match(/(?:\()(.+)+(?:\))/)[1].split(/[\s,]+/)
["param", "param2", "param3", "param4"]
编辑:
我们也可以过滤掉这些空元素(如果有的话):
>"someFunc( param , param2 , param3 )".match(/(?:\()(.+)+(?:\))/)[1].split(/[\s,]+/)
["", "param", "param2", "param3", ""]
>"someFunc( param , param2 , param3 )".match(/(?:\()(.+)+(?:\))/)[1].split(/[\s,]+/).filter(function(e){return e})
["param", "param2", "param3"]
答案 1 :(得分:1)
它实际上并没有跳过任何东西。
让我们分析您的正则表达式并尝试了解每个部分在第三个功能的情况下正在做什么。 someFunc(param, param2, param3)
。
正则表达式: \(([^,\s\)]+)(?:\s*,\s*([^,\s\)]+))*\)
([^,\s\)]+)
匹配param
并捕获组。
(?:\s*,\s*([^,\s\)]+))
会匹配您, string
所有, param2, param3
个实例。
所以匹配的完整字符串是
(param
, param2, param3)
但是,当您使用([^,\s\)]+)
时,最后捕获的子组是param3
,这也是,param2, param3
的一部分。在Regex101的匹配信息中也可以看到这一点。
答案 2 :(得分:1)
正如noob已经解释的那样,你匹配所有东西,但你的捕获组只存储最后一个匹配。有关更多信息,请参阅生成新捕获组的http://www.rexegg.com/regex-capture.html#spawn_groups。