问题
"function abc(m, n) { if (m && n) { console.log(m, n) } else { console.log('none') } } }";
答案
先直接上答案
let reg = /(function)([\w ]*)(\([\w ,]*\))/
funcStr = funcStr.replace(reg,"const$2= $3 =>")
输出为
const abc = (m, n) => { if (m && n) { console.log(m, n) } else { console.log('none') } } }
解释
关键在于,要从字符串中匹配出三部分:function,函数名,(m, n)
然后,将function改为const,函数名不用变,(m, n)改为 = (m, n) =>
这三部分,对应的是三个括号(function)([\w ]*)(\([\w ,]*\)),括号在正则表达式中指的是分组。
分组一,(function)
匹配function,这个简单,就是直接的字符匹配;
分组二,([\w ]*)
匹配函数名,以及空格;
*表示的是匹配前一个字符 0次或无限次,这里的前一个字符就是[\w ];
[]表示的是方括号中字符集的某个字符;
\w表示的是某个单词字符
所以[\w ]*就可以匹配到函数名以及周围的空格,这是一种贪婪模式(尽量多的匹配);
分组三,(\([\w ,]*\))
匹配函数的参数、括号、逗号;
\( 和 \) 匹配的是括号,这里用到了转义符号;
同分组二的分析, [\w ,]* 可以匹配到空格、逗号、函数的参数;
最后,funcStr.replace(reg,"const$2= $3 =>"),做了什么呢?
将funcStr中被reg匹配到的字符,替换成"const$2= $3 =>",而$2和$3代表的就是分组二和分组三匹配到的字符,之所以不没有$1,是因为function被const替换掉了。
小结
这个例子虽然没有用到正则表达式的所有知识点,但是真正自己弄懂了怎么实现的话,足够掌握正则表达式了。细节的知识点可以去看看下面的参考。