2015-12-30 35 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