修剪空白而不影响字符串

Posted

技术标签:

【中文标题】修剪空白而不影响字符串【英文标题】:Trimming whitespace without affecting strings 【发布时间】:2016-06-23 01:54:39 【问题描述】:

所以,我最近发现this example 在修剪空白处,但我发现它也会影响代码中的字符串。例如,假设我正在上关于字符串比较的课程,并且为了证明 "Hello World!""Hello World!" 不同,我需要代码压缩对这两个字符串没有任何影响。

我正在使用空格压缩,以便具有不同格式样式的人不会因为使用我不使用的东西而受到惩罚。例如,我喜欢这样格式化我的函数:

function foo()
    return 0;
;

而其他人可能会这样格式化:

function foo()

    return 0;
;

所以我在标点符号周围使用空格压缩来确保它总是相同,但我不希望它影响字符串中的任何内容。有没有办法在 javascriptreplace() 函数中添加异常?

【问题讨论】:

也许你可以对所有字符串进行标记,保留标记的映射,然后调整空格,然后用原始字符串内容替换标记? 我认为我什至没有听说过标记化。 【参考方案1】:

我在这里做了一个 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(""))

我相信这就是您正在寻找的。它处理字符串包含双引号等而不修改的情况。如您在帖子中提到的,此示例只是对花括号进行格式化。

基本上,拆分的行为允许将拆分器包含在数组中。而且由于您知道拆分总是在两个非字符串元素之间进行,因此您可以通过循环并仅修改每个偶数索引的数组元素来利用这一点。

如果你想进行一般的空白替换,你当然可以修改正则表达式或进行多次传递等。

【讨论】:

【参考方案2】:

更新:

检查这个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

【讨论】:

我试过了,但它似乎删除了带有字符串的部分。例如,print("Hello World!"); 就变成了print( ); @KelvinShadewing 我发现了错误在哪里,你可以再看看它) 我认为重要的是要记住,由于他正在处理不同用户的格式,因此您也可以将字符串包裹在单引号中。不仅如此,当你将 bot " 和 ' 的集合添加到正则表达式中时,正则表达式的贪婪会导致它提供错误的行为。 OP 没有要求他们两个,即使他要求我也不认为这是一个问题) 不,我没有,但那是因为我什至没有考虑到这一点。我认为这是一件值得注意的事情,尤其是因为有些人喜欢交替使用"' 而不是使用\"

以上是关于修剪空白而不影响字符串的主要内容,如果未能解决你的问题,请参考以下文章

VBA修剪留下领先的空白

如何修剪空白?

AS3从字符串的开头和结尾修剪空白

如何分解和修剪空白?

如何从正则表达式捕获组中修剪空白?

哪个更快?修剪()或正则表达式?