2015-12-30 32 views
4

我有一吨的东西大量的代码库声明如下:脚本JS逗号分隔的VAR声明拆分成多个变种声明

var x = 1, 
y = { 
    //some object 
}, 
z = function(arg) { 
    // some function 
}; 

我想运行一个脚本节点转换这一切到

var x = 1; 
var y = { 
    //some object 
}; 
var z = function(arg) { 
    // some function 
}; 

它并不像运行在其上的正则表达式为简单,因为一旦出现一个对象或功能,你不能只找逗号和分号了。

是否有一个现有的库或工具可以为我做这种转换?不希望缩小或丑化代码,我只是想修改现有的,人类可读的代码来摆脱逗号分隔的var声明。

+0

即不工作时在花括号里面有花括号,我可以为它写一个解析器,但是如果已经有包括边缘情况在内的所有这些开源解决方案,我不想这样做。 – Zacqary

+0

请求第三方库或工具在堆栈溢出时被认为是无关紧要的。 – jfriend00

回答

1

是否存在字符序列,后跟identifier,然后单个=可以存在于多个var声明之外的情况?我很难想出一个字符串与这些字符之外的一个字符串,因为一个=被用于赋值,而且我不确定为什么在赋值语句之前有一个逗号,除了初始化形式,重新尝试更换。

当然,在解析器更合适的情况下使用正则表达式总是有风险的。该模式将类似于:

,\s*([\$a-z_][\$a-z_0-9]*)(?=\s*=[^=])

注:在Visual Studio插件ReSharper的有这个非常操作的重构。但是,与许多其他重构不同,Resharper不提供全局应用这一选项的选项。

+0

啊我发现至少有一个地方会失败,这是一个多变量循环:'for(var x = 0,y = 1; ...)' –

+0

不需要在字符类中转义'$'。 –

1

也许我失去了一些东西,但如果所有的逗号分隔符说谎在一行的末尾,你可以只使用正则表达式:

replace(/,\n/g, ';\nvar '); 

这里有一个浏览器例如:

// in node, this would come straight from a file 
 
var string = 'var x = 1,\ny = {\n //some object \n},\nz = function(arg) {\n // some function\n};'; 
 

 
// heres an element we can use for results 
 
var code = document.getElementById('code'); 
 

 
// lets show original string 
 
code.innerHTML = string; 
 

 
// lets show the new string in a couple of seconds 
 
setTimeout(function() { 
 
    
 
    // the regex replace 
 
    var updated = string.replace(/,\n/g, ';\nvar '); 
 

 
    // updating the code element 
 
    code.innerHTML = updated; 
 
    
 
    // change color to signify finished 
 
    code.className = 'done'; 
 
    
 
}, 2000);
code { 
 
    
 
    white-space: pre-wrap; 
 
    white-space: -moz-pre-wrap; 
 
    white-space: -o-pre-wrap; 
 
    word-wrap: break-word; 
 
    
 
} 
 

 
.done { 
 
    
 
    background-color: #C0D9AF; 
 
    
 
}
<code id="code"></code>

1

这似乎这样的伎俩:

jsfmt --rewrite“a = b,c = d - > var a = b; VAR C = d;” input.js> output.js

input.js:

var x = 1, 
y = { 
    //some object 
}, 
z = function(arg) { 
    // some function 
}; 

output.js:使用

var x = 1; 
var y = { 
    //some object 
    }; 
var z = function(arg) { 
    // some function 
    }; 

jsfmt