正则表达式用单个空格替换多个空格


508

给定一个像这样的字符串:

“狗尾巴很长,而且是红色的!”

什么样的jQuery或JavaScript魔术可以用来将空间限制为最多一个空间?

目标:

“狗尾巴很长,而且是红色的!”

4
您是否还想匹配白话标签字符?
克里斯·法默

@Chris,是的,很好的问题。...用所有这些不同的答案,一个人应该怎么知道哪个是最有效的解决方案?
AnApprentice,2009年

2
下面的每个人都是正确的,但这是最优化的正则表达式:str.replace(/ +(?= )/g,'');您不需要替换任何不必要的东西。
埃文·卡罗尔

2
性能不会有任何明显的差异。您可以随时对其进行概要分析,但是我怀疑这样做是否值得。我会去最清楚的。
Draemon

@EvanCarroll:不正确-至少在Firefox上。该版本运行速度明显慢。请参阅我的答案中的分析结果(如下)。
爱德华·罗伯

Answers:


934

假设您还想覆盖标签,换行符等,只需替换\s\s+' '

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

如果您真的只想覆盖空格(而不是制表符,换行符等),请这样做:

string = string.replace(/  +/g, ' ');

4
您还需要在正则表达式中添加“ g”标志。
拉斐尔

6
当需要空白而不是制表符或换行符时,这将不起作用。对?/ \ s + /将正常工作。
Fabian

3
它可能对您来说更好,例如function removeExtraSpaces(string){ return string.replace(/\s{2,}/g, ' ');}
Math chiller

5
@Ethan:JS具有一个内置函数:trim()。它比正则表达式快。您可以这样做string.trim().replace(/\s\s+/g, ' ');string.replace(/\s\s+/g, ' ').trim();
BalusC

4
/\s\s+/g并且/\s{2,}/g不匹配空格字符,除非彼此至少相邻两个,例如将匹配\ t \ t但不匹配单个\ t。string.replace(/\s+/g, ' ')将匹配所有单个和多个空格字符子字符串,并替换为单个空格。
remyActual

159

由于您似乎对性能感兴趣,因此我使用Firebug进行了介绍。这是我得到的结果:

str.replace( /  +/g, ' ' )       ->  380ms
str.replace( /\s\s+/g, ' ' )     ->  390ms
str.replace( / {2,}/g, ' ' )     ->  470ms
str.replace( / +/g, ' ' )        ->  790ms
str.replace( / +(?= )/g, ' ')    -> 3250ms

这是在Firefox上运行的10万个字符串替换。

如果您认为性能存在问题,建议您使用Firebug进行性能分析测试。众所周知,人类无法预测程序瓶颈所在。

(还要注意,IE 8的开发人员工具栏还内置了一个探查器-可能值得检查IE中的性能。)


5
jsperf.com/removing-multiple-spaces来吧,JSPerf!最后一种方法;( / +(?= )/g, ' ');在IE9中失败,它留下了两个空格:"Foo Bar Baz".replace(/ +(?= )/g, ' ');->"Foo Bar Baz"
Nenotlep

怎么会有多大差异BW 1和2号线
维韦克·潘迪

@VivekPanday-我想这是因为第二行只用一个空格代替了双空格,而第一行也用空格代替了任何空格。我不知道这是节省搜索时间还是实际替换时间。
马洛里奇'16

这不会删除初始和尾随空格。为此,请参阅此答案
伊桑(Ethan)

通过降低速度按顺序进行编辑。Vivek和Maloric的注释指的是380 ms和790 ms的行。
Skippy le Grand Gourou

43
var str = "The      dog        has a long tail,      and it is RED!";
str = str.replace(/ {2,}/g,' ');

编辑: 如果您希望替换所有种类的空白字符,最有效的方法将是这样的:

str = str.replace(/\s{2,}/g,' ');

有趣的是,您的测试字符串甚至没有两个空格。
乔什·斯托多拉

刚刚意识到你已经有了我最近想出的东西,+1 :)
meder omuraliev 2009年

2
由于某些原因,此方法不起作用...很多“ ” 都出现了......可能是由于CKEDITOR ...
AnApprentice

K证明JQUERY的text()搞砸了。固定-谢谢大家!
2009年

16

这是一种解决方案,尽管它将针对所有空格字符:

"The      dog        has a long tail,      and it is RED!".replace(/\s\s+/g, ' ')

"The dog has a long tail, and it is RED!"

编辑:这可能会更好,因为它的目标是一个空格,后面跟一个或多个空格:

"The      dog        has a long tail,      and it is RED!".replace(/  +/g, ' ')

"The dog has a long tail, and it is RED!"

替代方法:

"The      dog        has a long tail,      and it is RED!".replace(/ {2,}/g, ' ')
"The dog has a long tail, and it is RED!"

我没用 /\s+/单独使用它,因为它可以多次替换跨越1个字符的空格,而且效率可能会更低,因为它的定位超出了必要。

如果有错误,我不会对所有这些进行深入测试。

另外,如果要进行字符串替换,请记住将变量/属性重新分配给它自己的替换,例如:

var string = 'foo'
string = string.replace('foo', '')

使用jQuery.prototype.text:

var el = $('span:eq(0)');
el.text( el.text().replace(/\d+/, '') )

1
第一个完全没有意义,\ s \ s +表示,一个\ s后跟一个或多个\ s +,可以将其简化为单个\ s +,第二个示例更为准确,因为我们只想替换双倍空格,而不是换行符,第三个更优化,因为它仅适用于2个以上空格的示例。但是str.replace(/ +(?=)/ g,'');仅适用于2个以上空格的示例,但可以节省使用空格分隔的空格。
埃文·卡罗尔

4
EvanCarroll 失败,因为\ s \ s +绝对不同于\ s +。\ s \ s +将匹配“ \ t \ t”或“ \ t \ t \ t”,但不匹配“ \ t”。这就是它的全部内容,您不想替换每个f-en单个空格字符。
2009年

我做。用于全文搜索(和摘要显示):请不要使用随机选项卡,不间断的标签或东西。
T4NK3R

13

我有此方法,由于缺乏更好的名称,我将其称为Derp方法。

while (str.indexOf("  ") !== -1) {
    str = str.replace(/  /g, " ");
}

在JSPerf中运行它会产生一些令人惊讶的结果。


2
如果事实证明我捏造了测试用例,而不是真的很快,那我将很尴尬:D
Nenotlep 2013年

提供测试用例...极好的答案!
Oytun 2014年

2
这让我感到很开心:-)有趣的是,“扎缠”通常比“精明”更好。“ Derp split”似乎踢了它的屁股。仍然值得指责。
弗雷德·甘特2015年

13

更加健壮的方法:如果存在初始和尾随空格,它将删除它们。例如:

// NOTE the possible initial and trailing spaces
var str = "  The dog      has a long   tail, and it     is RED!  "

str = str.replace(/^\s+|\s+$|\s+(?=\s)/g, "");

// str -> "The dog has a long tail, and it is RED !"

您的示例没有这些空格,但是它们也是一个非常常见的情况,并且可接受的答案只是将它们修剪成单个空格,例如:“ ... RED!”,这通常不是您所需要的。


3
我在PHP上使用了这种模式,并且可以工作。$ parts = preg_split(“ / ^ \ s + | \ s + $ | \ s +(?= \ s)/”,“ Avenida Tancredo Neves,745 PisoTérreoSala”);
布鲁诺·里贝罗

11

更强大:

功能修剪(单词)
{
    字= word.replace(/ [^ \ x21- \ x7E] + / g,''); //将非打印字符更改为空格
    返回word.replace(/ ^ \ s + | \ s + $ / g,``); //删除前导/尾随空格
}


6

我知道我参加晚会很晚,但是我发现了一个不错的解决方案。

这里是:

var myStr = myStr.replace(/[ ][ ]*/g, ' ');

6

如果您不想使用替换(如果不使用替换JavaScript替换字符串中的空格),则可以使用以下替代解决方案

var str="The dog      has a long   tail, and it     is RED!";
var rule=/\s{1,}/g;
str = str.split(rule).join(" "); 
document.write(str);

5

针对新手等的全面未加密答案。

这适用于像我这样的所有虚拟人,这些人测试了某些无法正常工作的人编写的脚本。

以下3个示例是我在以下3个网站上删除特殊字符和多余空格的步骤(所有这些都可以正常工作){1。EtaVisa.com 2. EtaStatus.com 3. Tikun.com},所以我知道它们完美地工作了。

我们一次将这些链与50多个链链接在一起,没有问题。

//删除了特殊字符+ 0-9,仅允许使用字母(大写和小写)

function NoDoublesPls1()
{
var str=document.getElementById("NoDoubles1");
var regex=/[^a-z]/gi;
str.value=str.value.replace(regex ,"");
}

//删除了特殊字符,只允许使用字母(大写和小写)和0-9 AND空格

function NoDoublesPls2()
{
var str=document.getElementById("NoDoubles2");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"");
}

//删除了特殊字符,只允许使用字母(大写和小写)和0-9 AND空格// //最后,.replace(/ \ s \ s + / g,“”)删除多余的空格//使用单引号,它不起作用。

function NoDoublesPls3()
{    var str=document.getElementById("NoDoubles3");
var regex=/[^a-z 0-9]/gi;
str.value=str.value.replace(regex ,"") .replace(/\s\s+/g, " ");
}

:: NEXT :: 将#3另存为a .js// //我叫我NoDoubles.js

:: NEXT :: 将JS包含在页面中

 <script language="JavaScript" src="js/NoDoubles.js"></script>

将此包含在您的表单字段中::例如

<INPUT type="text" name="Name"
     onKeyUp="NoDoublesPls3()" onKeyDown="NoDoublesPls3()" id="NoDoubles3"/>

这样看起来像这样

<INPUT type="text" name="Name" onKeyUp="NoDoublesPls3()" onKeyDown="NoDoublesPls3()" id="NoDoubles3"/>

这将删除特殊字符,允许使用单个空格并删除多余的空格。


这里发生了什么?格式看起来非常非常破损。
Nenotlep


1
var string = "The dog      has a long   tail, and it     is RED!";
var replaced = string.replace(/ +/g, " ");

或者,如果您也想替换标签:

var replaced = string.replace(/\s+/g, " ");

1
使用+看起来更干净,但是它也会用单个空格替换单个空格,有点多余,我不确定,但是使用更长的文本可能会造成性能问题。
ahmetunal,2009年

我倾向于使用最短,最简单的解决方案,并且只担心那种优化,如果我知道我需要匹配非常大的字符串,那时候我将实际测量不同的解决方案,看看哪个会快一点 如果没有测试,可能很难预先预测最快的速度。例如,在JavaScript解释器中,一些复杂的正则表达式将使您从快速的JIT编译实现转换为缓慢的解释实现。
布赖恩·坎贝尔

1

jQuery具有trim()函数,该函数基本上将类似“ FOo Bar”的内容转换为“ FOo Bar”。

var string = "  My     String with  Multiple lines    ";
string.trim(); // output "My String with Multiple lines"

它更有用,因为它会自动删除字符串开头和结尾的空格。无需正则表达式。


3
如您所说,trim()会删除字符串开头结尾处的空格,但不会删除字符串中间的空格,因此,在这种情况下它不起作用,输出将是“ My String with Multiple线”。api.jquery.com/jQuery.trim
egvaldes

1

是不使用替换,string = string.split(/ \ W + /);



0

我们可以使用以下sed system命令解释的正则表达式。类似的正则表达式可以在其他语言和平台中使用。

将文本添加到一些文件中说测试

manjeet-laptop:Desktop manjeet$ cat test
"The dog      has a long   tail, and it     is RED!"

我们可以使用以下正则表达式将所有空格替换为单个空格

manjeet-laptop:Desktop manjeet$ sed 's/ \{1,\}/ /g' test
"The dog has a long tail, and it is RED!"

希望这能达到目的


0

尝试使用单个空格替换多个空格。

<script type="text/javascript">
    var myStr = "The dog      has a long   tail, and it     is RED!";
    alert(myStr);  // Output 'The dog      has a long   tail, and it     is RED!'

    var newStr = myStr.replace(/  +/g, ' ');
    alert(newStr);  // Output 'The dog has a long tail, and it is RED!'
</script>

阅读更多@ 用单个空格替换多个空格


0
var text = `xxx  df dfvdfv  df    
                     dfv`.split(/[\s,\t,\r,\n]+/).filter(x=>x).join(' ');

结果:

"xxx df dfvdfv df dfv"

0

为了获得更多控制,您可以使用replace回调来处理该值。

value = "tags:HUNT  tags:HUNT         tags:HUNT  tags:HUNT"
value.replace(new RegExp(`(?:\\s+)(?:tags)`, 'g'), $1 => ` ${$1.trim()}`)
//"tags:HUNT tags:HUNT tags:HUNT tags:HUNT"

0

此脚本删除单词和修饰之间的所有空白(多个空格,制表符,返回等):

// Trims & replaces any wihtespacing to single space between words
String.prototype.clearExtraSpace = function(){
  var _trimLeft  = /^\s+/,
      _trimRight = /\s+$/,
      _multiple  = /\s+/g;

  return this.replace(_trimLeft, '').replace(_trimRight, '').replace(_multiple, ' ');
};

0

'鼠标指针触摸'.replace(/ ^ \ s + | \ s + $ |(\ s)+ / g,“ $ 1”)应该可以解决问题!


0

我知道我们必须使用正则表达式,但是在一次采访中,我被要求不要使用正则表达式。

@slylytyler帮助我采用了以下方法。

const testStr = "I   LOVE    STACKOVERFLOW   LOL";

const removeSpaces = str  => {
  const chars = str.split('');
  const nextChars = chars.reduce(
    (acc, c) => {
      if (c === ' ') {
        const lastChar = acc[acc.length - 1];
        if (lastChar === ' ') {
          return acc;
        }
      }
      return [...acc, c];
    },
    [],
  );
  const nextStr = nextChars.join('');
  return nextStr
};

console.log(removeSpaces(testStr));


考虑:console.log(testStr.split(“”).filter(s => s.length).join(“”))
dpjanes
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.