关于javascript:regex用单个空格替换多个空格

Regex to replace multiple spaces with a single space

给出如下字符串:

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

什么样的jquery或javascript魔术可以用来保持空间最大为一个空间?

目标:

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


考虑到您还想覆盖制表符、换行符等,只需将\s\s+替换为' '

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

如果您真的想只覆盖空格(因此不包括制表符、换行符等),请这样做:

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


因为你似乎对性能感兴趣,所以我用Firebug对它们进行了分析。以下是我得到的结果:

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

这是在Firefox上,运行100k字符串替换。

如果你认为性能是一个问题,我鼓励你用Firebug做你自己的分析测试。众所周知,人类在预测他们程序中的瓶颈在哪里时很糟糕。

(另外,请注意,IE8的开发人员工具栏也内置了一个探查器——可能值得检查一下IE中的性能。)


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

编辑:如果要替换所有类型的空白字符,最有效的方法如下:

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


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

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

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

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

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

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

替代方法:

1
2
"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个字符的空格,而且由于它的目标比需要的更高,所以效率可能会更低。

我没有对这些东西做深入的测试,所以如果有缺陷的话。

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

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

使用jquery.prototype.text:

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


我有这个方法,我称它为derp方法,因为它没有更好的名称。

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

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


一个更健壮的方法:如果初始空间和尾随空间存在的话,这也需要删除它们。如:

1
2
3
4
5
6
// 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 !"

您的示例没有这些空格,但它们也是一个非常常见的场景,接受的答案只是将这些空格裁剪为单个空格,例如:"the…红色!"这不是你通常需要的。


更稳健:

1
2
3
4
5
function trim(word)
{
    word = word.replace(/[^\x21-\x7E]+/g, ' '); // change non-printing chars to spaces
    return word.replace(/^\s+|\s+$/g, '');      // remove leading/trailing spaces
}

我建议

1
string = string.replace(/ +/g,"");

仅用于空间或

1
string = string.replace(/(\s)+/g,"$1");

将多个收益转化为一个收益。


如果不想使用replace(不使用replace javascript替换字符串中的空格),这里有一个替代解决方案。

1
2
3
4
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);


我知道我参加晚会迟到了,但我发现了一个很好的解决办法。

这里是:

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


Newbies等人的全面未加密答案。

这是给所有像我这样的傻瓜的,他们测试你们中一些人写的脚本,但这些都不起作用。

以下3个示例是我在以下3个网站上删除特殊字符和额外空格的步骤(所有这些操作都非常有效)1。EtavISa.com 2。etastatus.com 3.Tikun.com所以我知道这些很好用。

我们一次用50多个链子把它们连在一起,没有问题。

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

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

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

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

//这删除了特殊字符,只允许字母(大写和小写)、0-9和空格//结尾的.replace(/ss+/g,"")删除了多余的空格//当我使用单引号时,它不起作用。

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

接下来::save 3 as a .js//我叫mine nodoubles.js

接下来::在页面中包含JS

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

在表单域中包含此项::例如

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

所以看起来像这样

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

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


还有一种可能性:

1
str.replace( /\s+/g, ' ' )

jquery有trim()函数,它基本上将类似"foo bar"的内容转换为"foo bar"。

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

它更有用,因为它会自动删除字符串开头和结尾的空格。不需要regex。


在SED系统命令的帮助下,我们可以使用下面的regex。类似的regex可用于其他语言和平台。

将文本添加到某个文件中,比如说test

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

我们可以使用以下regex将所有空格替换为单个空格

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

希望这符合目的


is replace is not used,string=string.split(/w+/);


尝试将多个空格替换为单个空格。

1
2
3
4
5
6
<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!'

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


1
2
3
4
var text = `xxx  df dfvdfv  df    
                     dfv`.split(/[\s,\t,
,
]+/).filter(x=>x).join(' ');

结果:

1
"xxx df dfvdfv df dfv"

1
2
3
var myregexp = new RegExp(/ {2,}/g);

str = str.replace(myregexp,' ');

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

或者如果您还想替换选项卡:

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


对于更多控件,可以使用replace回调来处理该值。

1
2
3
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"

此脚本将删除单词和贴面之间的任何空白(多个空格、制表符、回车等):

1
2
3
4
5
6
7
8
// 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, ' ');
};