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

IT技术 javascript jquery regex
2021-01-28 06:13:19

给定一个字符串,如:

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

什么样的 jQuery 或 JavaScript 魔术可以用来将空格保持在一个空格最大值?

目标:

“这条狗尾巴很长,而且是红色的!”
6个回答

鉴于您还想覆盖制表符、换行符等,只需替换\s\s+' '

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

如果您真的只想覆盖空格(因此不包含制表符、换行符等),请执行以下操作:

string = string.replace(/  +/g, ' ');
@Ethan:JS有一个内置函数:trim()它比正则表达式快。你可以只做string.trim().replace(/\s\s+/g, ' ');string.replace(/\s\s+/g, ' ').trim();
2021-03-19 06:13:19
作为一个函数,它可能对你更好,比如 function removeExtraSpaces(string){ return string.replace(/\s{2,}/g, ' ');}
2021-03-20 06:13:19
这是否也删除了空白制表符?
2021-03-25 06:13:19
/\s\s+/g并且/\s{2,}/g不匹配空白字符,除非至少有两个彼此相邻,例如将匹配 \t\t 但不会匹配单个 \t。string.replace(/\s+/g, ' ')将匹配所有单个和多个空白字符子字符串并替换为单个空格。
2021-03-28 06:13:19
当需要空白而不是制表符或换行符时,这不起作用。对?/\s+/ 将工作。
2021-04-09 06:13:19

由于您似乎对性能感兴趣,因此我使用 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 上,运行 100k 字符串替换。

如果您认为性能有问题,我鼓励您使用 firebug 进行自己的分析测试。众所周知,人类不擅长预测他们程序中的瓶颈所在。

(另外,请注意 IE 8 的开发人员工具栏也有一个内置的分析器——可能值得检查一下 IE 中的性能如何。)

这不会删除初始和尾随空格。为此,请参阅此答案
2021-03-18 06:13:19
jsperf.com/removing-multiple-spaces继续使用 JSPerf!最后一种方法;( / +(?= )/g, ' ');在 IE9 中失败,它留下双空格:"Foo Bar Baz".replace(/ +(?= )/g, ' ');-->"Foo Bar Baz"
2021-03-31 06:13:19
@VivekPanday - 我想这是因为第二行只是用一个空格替换了双空格的出现,而第一行也用空格替换了任何空格。这是在搜索过程中节省的时间还是实际替换的时间,我不知道。
2021-04-02 06:13:19
var str = "The      dog        has a long tail,      and it is RED!";
str = str.replace(/ {2,}/g,' ');

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

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

一个更健壮的方法:这还负责删除初始和尾随空格(如果它们存在)。例如:

// 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 ... RED!”,这不是您通常需要的。

我在 PHP 上使用了这种模式并且有效。$parts = preg_split("/^\s+|\s+$|\s+(?=\s)/", "Avenida Tancredo Neves, 745 Piso Térreo Sala");
2021-03-19 06:13:19

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

"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 个或多个空格:

"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 个字符的空格,并且可能效率较低,因为它的目标超出了必要的范围。

我没有深入测试任何这些所以 lmk 如果有错误。

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

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

使用 jQuery.prototype.text:

var el = $('span:eq(0)');
el.text( el.text().replace(/\d+/, '') )
EvanCarroll 你失败了,因为 \s\s+ 绝对不同于 \s+。\s\s+ 将匹配 '\t\t' 或 '\t\t\t' 但不匹配 '\t'。这就是它的全部内容,您不想替换每个 f-en 单个空格字符。
2021-03-22 06:13:19
我做。用于全文搜索(和片段显示):请不要使用随机标签、非破坏者或事物。
2021-03-25 06:13:19
第一个完全没有意义,\s\s+ 的意思是,一个\s 后跟一个或多个\s+,可以简化为单个\s+,第二个例子更准确,因为我们只想替换双空格,而不是换行符,第三个更优化,因为它仅适用于具有 2 个以上空格的示例。但是 str.replace(/ +(?= )/g,''); 仅适用于具有 2+ 个空格的示例,但可以节省用空格步骤覆盖空格。
2021-04-05 06:13:19