JavaScript正则表达式:除双引号中的内容外,删除所有空格

5
我有一个字符串需要去掉所有空格,除了在""之间的空格。这是我用来去除空格的正则表达式。
str.replace(/\s/g, "");

我似乎无法找出如何忽略引号之间的空格。 例如:

str = 'Here is my example "leave spaces here", ok im done'
Output = 'Hereismyexample"leave spaces here",okimdone'

引号的开头和结尾是否有保证? - Explosion Pills
1
提醒一下:不要创建名为String的变量,因为已经有一个具有此名称的函数/构造函数(请改用string)。 - Danilo Valente
2
几乎从不。然而,覆盖本地变量并不是一个好的实践方法(除非必要且有意)。另外,正如我所说,这只是一个提醒,而不是规则。 - Danilo Valente
1
@Jan:如果这是全局范围,它会覆盖它们。有趣的实验:在控制台中在此页面上键入 var String ='foo'; 并尝试单击“添加/显示更多评论” :) - Felix Kling
@FelixKling是正确的。在全局范围内,var String等同于window.String - Danilo Valente
显示剩余3条评论
3个回答

9

另一种方法。这个假设字符串的双引号部分不允许转义(例如没有"leave \" space \" here"),但可以轻松修改以允许它。

str.replace(/([^"]+)|("[^"]+")/g, function($0, $1, $2) {
    if ($1) {
        return $1.replace(/\s/g, '');
    } else {
        return $2; 
    } 
});

修改正则表达式以允许在引号字符串内转义"

/([^"]+)|("(?:[^"\\]|\\.)+")/

8
var output = input.split('"').map(function(v,i){
   return i%2 ? v : v.replace(/\s/g, "");
}).join('"');

请注意,我重新命名了变量,因为我不能使用以大写字母开头的变量名称编写代码,特别是当它是语言的标准构造函数时。当你有疑问时,我建议你遵循这些指南

“其名称以大写字母开头或为语言的标准构造函数。”-- 后者不就意味着前者吗? - John Dvorak
@JanDvorak 我的意思是我也不喜欢 Output - Denys Séguret

4

Rob,重新提出这个问题是因为它有一个简单的解决方案,只需要调用一个replace,而不是两个(在寻找正则表达式赏金任务的过程中发现了你的问题。)

这个正则表达式非常简短:

"[^"]+"|( )

替换的左侧匹配完整的引号字符串,我们将忽略这些匹配。右侧匹配并捕获空格到第1组中,我们知道它们是正确的空格,因为它们没有被左侧表达式匹配。

以下是可行的代码(请参见演示):

var subject = 'Here is my example "leave spaces here", ok im done';
var regex = /"[^"]+"|( )/g;
replaced = subject.replace(regex, function(m, group1) {
    if (group1 == "" ) return m;
    else return "";
});
document.write(replaced);

参考资料

  1. 如何排除某些情况下的匹配模式
  2. 如何匹配模式,除非...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接