我正在努力获得一个javascript正则表达式来处理一些边缘情况。
目标是使用一些js代码获取一个字符串并使用原始参数重写一个函数。
一个简单的案例是:'apples("a", 1, {value: 2})'
将成为'bananas("a", 1, {value: 2})'
。
然而,当你处理实际代码时,它会有点复杂。例如,用嵌套函数,return语句和多行对象替换该函数的“promisified”版本的函数:
string = 'function(){
return Request({
json:true,
url: "http://google.com"
method: "GET"
})
}'
在这种情况下,我期望的结果是:
string = 'function(){
return newPromiseFunction({
json:true,
url: "http://google.com"
method: "GET"
}).then(function( res ){ console.log(res) })
}'
所以我最好的尝试是:
var substring = string.match(/\return\sRequest+\(.+?\)/g );
var argsString = substring[0].match( /\((.*?)\)/ );
var result = 'return newPromiseFunction('+ argsString + ').then(function( res ){ console.log(res) })}'
但是,只有参数中没有换行符或制表符时,此代码才有效。但是多线对象(如上所述)将失败。
上面的正则表达式有一个简单的解决方法吗?有更简单的方法吗?正则表达式甚至是解决这个问题的最好方法吗?
答案 0 :(得分:2)
这似乎有效:
var codestring = `function(){
return Request({
json:true,
url: "http://google.com"
method: "GET"
})
}`;
var reg = /return\s+Request\((\{[\S\s]*?\})\)/g;
var result = codestring.replace(reg, "return newPromiseFunction($1).then(function( res ){ console.log(res) })");
alert(result);
请注意,back-ticks用于为代码字符串创建多行字符串 如果您的解析器没有准备好ES6,可能需要更改它。
而不是匹配&字符串连接,它现在是一个即时替换 但这真的只是一个选择。另一种方法可以使用相同的结果。
此外,[\S\s]*?
代替了.*?
,因为.
并未涵盖换行符。
答案 1 :(得分:1)
你在这里:
var code = `function() {
return Request({
json: true,
url: "http://google.com"
method: "GET"
});
}`
var result = code.replace(/return\s+Request\s*\(([^\)]*)\)/g,
(m, g1) => 'return newPromiseFunction('+ g1 + ').then(function( res ){ console.log(res) })}'
);
logs.innerText = result;
<pre id="logs"></pre>