function extractArgs(fn) { //angular 这里还加了注释、箭头函数的处理
var args = fn.toString().match(/^[^\(]*\(\s*([^\)]*)\)/m);
return args[1].split(',');
}
正则表达式:/^[^\(]*\(\s*([^\)]*)\)/m
目的是匹配函数fn括号中的参数,表达式分析:
1.[^\(]* 表达式的意思是不包含(是其他字符,零到任意多个。解释:[ ]里的内容是一个表达式,后边的*是限制符。正则一般都是这种形式,表达式后边跟一个限制符。表达式在上面例子中的意思是匹配函数 function xxx (‘(‘ 之前的字符)这一串字符的。
2.\( 匹配 '('
3.\s* 匹配零到多个空格
4.([^\)]*) 匹配不包含‘)’的零到多个任意字符,同时这也是一个捕获组
5.\) 匹配‘)’
翻译为语言:匹配字符串中不包含‘(’ 的任意字符,后边跟一个左括号‘(’,左括号可以有零到多个空格,括号里内容是零到任意多个不包含右括号‘)’的字符,最后跟一个右括号。最终会返回一个长度为2的数组(可以看下例)
匹配项方法一:
从母字符串的开头开始匹配
<html>
<body>
<script type="text/javascript">
var str="function test(ysx,xjh){alert(123);}"
var args = str.match(/^[^\(]*\(\s*([^\)]*)\)/m);
document.write(args);
</script>
</body>
</html>
可以查看数组项:
方法二、
直接从需要的地方匹配字符串,直接从‘(’ 开始的
<html>
<body>
<script type="text/javascript">
var str="function test(ysx,xjh){alert(123);}"
var args = str.match(/\(\s*([^\)]*)\)/m);
document.write(args);
</script>
</body>
</html>