2016-03-08 74 views
2

所以,我最近發現this example修剪空白,但我發現它也影響代碼中的字符串。例如,假設我在字符串比較上做了一課,爲了證明"Hello World!""Hello World!"是不同的,我需要代碼壓縮才能對這兩個字符串沒有任何影響。修剪空白而不影響字符串

我使用空格壓縮,以便不同格式風格的人不會因使用我不使用的東西而受到懲罰。舉例來說,我想格式化我的功能是這樣的:

function foo(){ 
    return 0; 
}; 

當別人格式化是這樣的:

function foo() 
{ 
    return 0; 
}; 

於是我就用空格壓縮標點符號,以確保它永遠是相同的,但我不希望它影響字符串內的任何內容。有沒有辦法在JavaScript的replace()函數中添加例外?

+0

也許你可以令牌化所有的字符串,保持地圖的標記,然後調整空白,然後更換原始字符串內容的標記? –

+0

我不認爲我甚至聽說過分詞。 –

回答

1

UPDATE:

檢查這個jsfiddle

var str='dfgdfg fdgfd fd gfd g print("Hello  World!"); sadfds    dsfgsgdf' 
var regex=/(?:(".*"))|(\s+)/g; 
var newStr=str.replace(regex, '$1 '); 
console.log(newStr); 
console.log(str); 

在這段代碼將處理以外的所有引用的字符串

與代碼更舒適玩,你可以看到正則表達式正在工作: https://regex101.com/r/tG5qH2/1

+0

我試過了,但似乎刪除了帶有字符串的部分。例如,'print(「Hello World!」);''變成'print();'。 –

+0

@KelvinShadewing我發現錯誤是在哪裏,你可以再看看它) –

+0

我認爲重要的是要記住,因爲他處理不同的用戶的格式,所以你可能會得到包裝在單引號中的字符串。不僅如此,當你將bot和''的集合添加到正則表達式中時,正則表達式的貪婪會導致它提供錯誤的行爲 –

0

我在這裏做了一個的jsfiddle:https://jsfiddle.net/cuywha8t/2/

var stringSplitRegExp = /(".+?"|'.+?')/g; 
var whitespaceRegExp = /\s+\{/g; 
var whitespaceReplacement = "{" 

var exampleCode = `var str = "test test test" + 'asdasd "sd"';\n`+ 
        `var test2 = function()\n{\nconsole.log("This is a string with 'single quotes'")\n}\n`+ 
        `console.log('this is a string with "double quotes"')`; 

console.log(exampleCode) 

var separatedStrings =(exampleCode.split(stringSplitRegExp)) 

for(var i = 0; i < separatedStrings.length; i++){ 
    if (i%2 === 1){ 
    continue; 
    } 
    var oldString = separatedStrings[i]; 
    separatedStrings[i] = oldString.replace(whitespaceRegExp, whitespaceReplacement) 
} 

console.log(separatedStrings.join("")) 

我相信這是你在找什麼。它處理一個字符串包含雙引號等情況,而無需修改。這個例子只是在你的文章中提到的花括號的格式。

基本上,split的行爲允許在數組中包含分離器。既然你知道分割總是在兩個非字符串元素之間,你可以通過循環和修改每個偶數索引的數組元素來利用這個。

如果你想要做的一般空格替換你當然可以修改正則表達式或做多遍,等