JS regex从一个函数字符串中提取多行参数

JS regex to extract multiline arguments from a function string

本文关键字:字符串 提取 参数 函数 一个 regex JS      更新时间:2023-09-26

我正在努力得到一个javascript正则表达式工作在一些边缘情况。

目标是用一些js代码获取一个字符串,并使用原始参数重写一个函数。一个简单的例子是:'apples("a", 1, {value: 2})'变成'bananas("a", 1, {value: 2})'

然而,当你处理实际的代码时,它就有点复杂了。例如,用嵌套函数、返回语句和多行对象替换"承诺"版本的函数:

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) })}'

然而,这段代码只有在参数中没有换行符和制表符的情况下才有效。但是多行对象(如上所述)将失败。

是否有一个简单的修复我的正则表达式上面?有更简单的方法吗?regex是解决这个问题的最好方法吗?

这似乎行得通:

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);

请注意,反引号用于为codestring创建多行字符串。
如果您的解析器不支持ES6,可能需要更改它。

而不是match &字符串连接,它现在是一个即时替换。
但这只是一种选择。使用另一种方法可以得到相同的结果。

另外,由于.不覆盖换行符,所以用['S's]*?代替.*?

给你:

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>