我一直在尝试创建一个匹配函数参数的正则表达式。
这是完整的示例(带有 Debug模式):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"]
任何帮助都会很棒。
谢谢!
最佳答案
只需使用一个简单的正则表达式即可获取圆括号之间的所有内容并以逗号分隔:
>"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"]
关于javascript - 匹配函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36195182/