ChatGPT解决这个技术问题 Extra ChatGPT

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

给定一个字符串,如:

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

可以使用哪种 jQuery 或 JavaScript 魔法来将空格保持在最大一个空格?

目标:

"The dog has a long tail, and it is RED!"
您还想匹配空白制表符吗?
@Chris,是的,很好的问题....有了所有这些不同的答案,人们应该如何知道哪个是最有效的解决方案?
下面的每个人都是对的,但这是最优化的正则表达式:str.replace(/ +(?= )/g,''); 你没有替换任何你不需要的东西。
性能上不会有任何明显的差异。您总是可以对其进行分析,但我怀疑这是否值得。我会选择最清晰的。
@EvanCarroll:不是真的——至少在 Firefox 上。该版本运行速度明显较慢。请参阅我的答案中的分析结果(如下)。

B
BalusC

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

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

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

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

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

由于您似乎对性能感兴趣,因此我使用 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 中的性能。)


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

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

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

E
Ethan

一个更健壮的方法:如果存在的话,这也会删除初始和尾随空格。例如:

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


我在 PHP 上使用了这种模式并且可以工作。 $parts = preg_split("/^\s+|\s+$|\s+(?=\s)/", "Avenida Tancredo Neves, 745 Piso Térreo Sala");
这看起来比简单的初步 .trim() 效率低。
m
meder omuraliev

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

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

如果有错误,我没有深入测试这些中的任何一个。

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

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

使用 jQuery.prototype.text:

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

第一个完全没有意义,\s\s+的意思是,一个\s后跟一个或多个\s+,可以简化为单个\s+,第二个例子更准确,因为我们只想替换双空格,而不是换行符,第三个更优化,因为它仅适用于具有 2+ 个空格的示例。但是 str.replace(/ +(?= )/g,''); 仅适用于具有 2+ 个空格的示例,但可以节省使用空格步覆盖空格。
EvanCarroll 你失败了,因为 \s\s+ 绝对不同于 \s+。 \s\s+ 将匹配 '\t\t' 或 '\t\t\t' 但不匹配 '\t'。这就是它的全部内容,您不想替换每个 f-en 单个空白字符。
我愿意。用于全文搜索(和片段显示):请不要使用随机选项卡、非破坏者或 thingyjigs。
J
Joel Peltonen

我有这个方法,我把它叫做 Derp 方法,因为没有更好的名字。

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

在 JSPerf 中运行它会得到一些令人惊讶的结果,它击败了一些更复杂的方法 EDIT 原始 JSPerf 链接 http://jsperf.com/removing-multiple-spaces/3 在当时似乎已失效


我没有对此投反对票,但这看起来效率低下,而且 JSPerf 链接已失效,我无法查看“令人惊讶的结果”。所以我转而问你:这是否足以令人惊讶地被赞成?
@КонстантинВан 感谢您指出死链接!
j
james.garriss

更健壮:

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
}

如果可以.trim(),您为什么要replace修剪?
N
Narendra Jadhav

如果您不想使用替换,这是一个替代解决方案(在不使用替换 JavaScript 的情况下替换字符串中的空格)

var str="这只狗有一条长尾巴,它是红色的!"; var rule=/\s{1,}/g; str = str.split(rule).join(" "); document.write(str);


如果您不想使用 replace”?为什么一个人不想使用它? splitjoin 显然比 replace 调用慢得多。
L
Leonard Meagher

我建议

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

仅用于空格或

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

也可以将多个回报变成一个回报。


r
rfunduk

还有一种可能:

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

T
ToXic73

我知道我迟到了,但我发现了一个很好的解决方案。

这里是:

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

这与 / +//[ ]+/ 有何不同?
s
semuzaboi

新手的综合未加密答案等。

这适用于像我这样测试你们中的一些人编写的脚本但不起作用的所有傻瓜。

以下 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 和空格 // 最后的 .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"/>

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


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

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

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

使用 + 似乎更干净,但它也会用单个空格替换单个空格,有点多余,我不确定,但它可能会产生更长文本的性能问题。
我倾向于使用最短、最简单的解决方案,如果我知道我需要匹配一个非常大的字符串,我只会担心这种优化,那时我会实际测量不同的解决方案,看看哪个会更快。如果不进行测试,可能很难提前预测什么是最快的;例如,在 JavaScript 解释器中,一些复杂的正则表达式会导致你从一个快速的 JIT 编译实现切换到一个慢解释的实现。
a
ahmetunal
var myregexp = new RegExp(/ {2,}/g);

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

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

结果:

"xxx df dfvdfv df dfv"

很好的答案。它也删除了换行符:)
首先,当您可以做一个简单的 replace 时,您为什么要 splitjoin?其次,你的字符集也匹配“,”。
x
xSachinx

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

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

const testStr = "我喜欢堆栈溢出哈哈"; 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; } } 返回 [...acc, c]; }, [], ); const nextStr = nextChars.join('');返回下一个字符串 }; console.log(removeSpaces(testStr));


考虑:console.log(testStr.split(" ").filter(s => s.length).join(" "))
@dpjanes 谢谢,伙计,我们是否有任何类似的链函数来从数组中获取“DISTINCT”元素,我们将使用相同的数组,没有新数组
哈哈,我喜欢挑战。没有完全链接,而是一行:console.log(Array.from(new Set("I LOVE STACKOVERFLOW LOL LOVE".split(" ").filter(s => s.length))).join(" ") )
核心概念是 Array.from(new Set())。
m
minhas23

我们可以在 sed 系统命令的帮助下使用以下正则表达式。类似的正则表达式可用于其他语言和平台。

将文本添加到某个文件中说测试

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!"

希望这能达到目的


j
jonathan klevin

试试这个用一个空格替换多个空格。

<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>

阅读更多@Replacing Multiple Spaces with Single Space


旧答案的副本。
j
jackotonye

要获得更多控制,您可以使用替换回调来处理该值。

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"

O
Oriol

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

// 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, ' ');
};

如果可以.trim(),为什么要replace两次
R
Ruwan Epage

' mouse pointer touch '.replace(/^\s+|\s+$|(\s)+/g, "$1") 应该可以解决问题!


佚名

我的名字是 Edelcio Junior。如果您想防止 2 个或更多空格,这是一个很好的解决方案:

<label">Name</label>
<input type="text" name="YourInputName">

<script>
  var field = document.querySelector('[name="YourInputName"]');

  field.addEventListener('keyup', function (event) {
    var userName = field.value;
    userName = userName.replace(/\s{2,}/g, ' ');
    field.value = userName;
  });
</script>

var field = document.querySelector('[name="YourInputName"]'); field.addEventListener('keyup', function (event) { var userName = field.value; userName = userName.replace(/\s{2,}/g, ' '); field.value = userName; }); Your-title


P
P K Dhee Taal
let nameCorrection = function (str) {
  let strPerfect = str.replace(/\s+/g, " ").trim();
  let strSmall = strPerfect.toLowerCase();
  let arrSmall = strSmall.split(" ");
  let arrCapital = [];
  for (let x of arrSmall.values()) {
    arrCapital.push(x[0].toUpperCase() + x.slice(1));
  }

  let result = arrCapital.join(" ");
  console.log(result);
};
nameCorrection("Pradeep kumar dHital");

第二行代码有助于用一个替换多个空格。如果在字符串的开头或结尾有空格,最后的 trim 方法会修剪掉空格
我的意思是,这不是你的笔记本。标题大小写与问题无关。
V
Viraj

def removeblanks(text): return re.sub(r'\s\s+'," ",text) 我正在处理包含大量重复空格的大型文本数据。上面的 RE 对我有用。所有重复的空格都被一个空格替换。


H
Haji Rahmatullah

使用 nodepad++ 函数,下面的正则表达式对我来说很好,

查找: {1}\K\s+
替换:leave it empty