2016-03-08 80 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的行为允许在数组中包含分离器。既然你知道分割总是在两个非字符串元素之间,你可以通过循环和修改每个偶数索引的数组元素来利用这个。

如果你想要做的一般空格替换你当然可以修改正则表达式或做多遍,等