JS正则表达式从函数字符串中提取多行参数

时间:2016-06-24 18:17:53

标签: javascript regex

我正在努力获得一个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) })}'

但是,只有参数中没有换行符或制表符时,此代码才有效。但是多线对象(如上所述)将失败。

上面的正则表达式有一个简单的解决方法吗?有更简单的方法吗?正则表达式甚至是解决这个问题的最好方法吗?

2 个答案:

答案 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>