用JavaScript字符串中的单个空格替换多个空格


Answers:


371

像这样:

var s = "  a  b     c  ";

console.log(
  s.replace(/\s+/g, ' ')
)


31
@Me请仔细阅读以下问题:“每次都有多个空白,我希望只有一个空白”。
bjornd

5
这不是很明显吗?它用1个空白字符替换了1个以上的空白字符。(预期结果)
战争

4
@CiaranG这是正常的表达
pomeroy

1
@Wardy,关闭:-)。它用一个空格替换一个或多个(但实际上是所需的结果)。
greenoldman 2015年

1
如果要用相同类型的空格替换1+个空格怎么办?(例如2+个空格和一个换行符,3个换行符和一个换行符,等等。)如果同时存在换行符和空格,则必须用换行符替换,而如果同时存在空格和制表符,则必须用a替换。空间
Tom

61

您可以扩展String以将这些行为实现为方法,如下所示:

String.prototype.killWhiteSpace = function() {
    return this.replace(/\s/g, '');
};

String.prototype.reduceWhiteSpace = function() {
    return this.replace(/\s+/g, ' ');
};

现在,您可以使用以下优雅的形式来生成所需的字符串:

"Get rid of my whitespaces.".killWhiteSpace();
"Get rid of my extra        whitespaces".reduceWhiteSpace();

14
标准对象的增强原型是一个有争议的模式。对于这样的基本问题,我不推荐使用。
bjornd 2012年

@XavierJohn它是String,带有R,而不是Sting。
LasagnaAndroid 2014年

20

将正则表达式与replace函数配合使用可达到以下目的:

string.replace(/\s/g, "")

每个问题此解决方案都是错误的。我真的很好奇,为什么您在发布更好的解决方案两天后就发布了它?
Sebastian Mach 2015年

我认为当时只有此代码对我有用。我无法再对此进行确认。我显然会首先尝试最好的解决方案。另外,在chrome控制台中对其进行检查后,两种解决方案似乎都可以使用。但是,有趣的是,当我将结果复制到此注释框时,它表明我的解决方案不适用于多个空格。也许您可以帮助我了解原因。我猜这是镀铬错误?尝试在chrome控制台中运行我的代码,让我知道。
罗杰·加杰伊

13

这是一个非正则表达式的解决方案(只是为了好玩):

var s = ' a   b   word word. word, wordword word   ';

// with ES5:
s = s.split(' ').filter(function(n){ return n != '' }).join(' ');
console.log(s); // "a b word word. word, wordword word"

// or ES6:
s = s.split(' ').filter(n => n).join(' '); 
console.log(s); // "a b word word. word, wordword word"

它将字符串按空格分隔,从数组中删除所有空数组项(大于单个空格的项),然后将所有单词再次连接到字符串中,并在它们之间使用单个空格。


12

我假设您正在寻找从字符串的开头和/或结尾去除空格(而不是删除所有空格?

如果是这种情况,则需要这样的正则表达式:

mystring = mystring.replace(/(^\s+|\s+$)/g,' ');

这将从字符串的开头或结尾删除所有空格。如果只想从末尾修剪空格,则正则表达式将改为如下所示:

mystring = mystring.replace(/\s+$/g,' ');

希望能有所帮助。


4
我喜欢您的正则表达式@Spudley的简单性,但是您的代码是否不会在开头和结尾用一个空格字符替换空白的运行?我以为目标是完全删除结尾处的空格,在这种情况下,替换字符串应''改为' '
兰德尔·库克


6

我知道我不应该在某个主题上发表论文,但是鉴于问题的细节,我通常将其扩展为:

  • 我想用单个空格替换字符串中多次出现的空格
  • ...而且...我不希望在字符串的开头或结尾处留空格(修剪)

为此,我使用这样的代码(第一个regexp的括号是为了使代码更具可读性...除非您熟悉它们,否则regexp会很痛苦):

s = s.replace(/^(\s*)|(\s*)$/g, '').replace(/\s+/g, ' ');

这样做的原因是String对象上的方法返回一个字符串对象,您可以在该对象上调用另一个方法(就像jQuery和其他一些库一样)。如果要在单个对象上连续执行多个方法,则可以使用更紧凑的编码方式。


一为“准备就绪”的例子。我打算将它张贴我的自我
d.raev

正是我要找的东西,太棒了!
robertp 2013年

4

var x =“ Test Test Test” .split(“”).join(“”); 警报(x);


5
它有效,但不是智能编码。此代码比RegEx慢。我想知道Split()是否不使用RegEx分割字符串!
Farandole,2012年

2

试试这个。

var string = "         string             1";
string = string.trim().replace(/\s+/g, ' ');

结果将是

string 1

这里发生的是它将首先使用trim()修剪外部空间,然后使用修剪内部空间.replace(/\s+/g, ' ')


0

如果要限制用户在名称中提供空格,只需创建一个if语句并给出条件。像我一样:

$j('#fragment_key').bind({
    keypress: function(e){
        var key = e.keyCode;
    var character = String.fromCharCode(key); 
    if(character.match( /[' ']/)) {
        alert("Blank space is not allowed in the Name");
        return false;
        }
    }
});
  • 创建一个JQuery函数。
  • 这是按键事件。
  • 初始化变量。
  • 给条件配字
  • 显示您符合条件的警报消息。

0

这个怎么样?

"my test string \t\t with crazy stuff is cool ".replace(/\s{2,9999}|\t/g, ' ')

输出 "my test string with crazy stuff is cool "

这个也摆脱任何标签


选项卡已被覆盖\s。不必要复杂的正则表达式,不妨只写/\s+/g
Anders Rabo Thorbeck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.