用'+'替换字符串中的所有空格

458

我有一个包含多个空格的字符串,我想用加号符号替换它们。我以为我可以使用

var str = 'a b c';
var replaced = str.replace(' ', '+');

但它只替换第一次出现的。我该如何使它替换所有出现的地方?


8
你想对一个字符串进行URL编码吗? 如果是这样,最好寻求有关此操作的帮助,而不仅仅是如何处理空格。 - Lasse V. Karlsen
2
@Lasse,我想最终这就是我试图做的,因为我想要格式化的字符串最终将成为URL的一部分。然而,我认为这个问题仍然有其自身的价值,因为在字符串中替换所有子字符串的出现并不是显而易见的。 - DaveDev
15
没错,这也是我怀疑的。答案是:使用 encodeURIComponent()。不要尝试使用字符串替换来自己实现编码,这比你想象的要棘手得多。这将把空格编码为 %20 而不是 +%20 同样有效(实际上更有效,因为它适用于路径组件,而 + 仅在查询组件中表示空格),但如果你想让它看起来更漂亮,当然可以之后做一个 replace(/%20/g, '+')。你可能会想使用 escape(),因为它使用 +,但它也会错误地处理所有非 ASCII 字符 —— 需要避免。 - bobince
1
我同意这一点,这个问题本身是有价值的 :) 我只是想知道你是否试图到达那个目的地,可能还有更好的解决方案适合你。但是没错,这个问题本身很好,毫无疑问。我懂得足够的JavaScript来应付,而且那个.replace没有替换掉所有出现的位置对我来说是新闻。 - Lasse V. Karlsen
3
正则表达式与字符串拆分/拼接在短字符串和长字符串上的比较。http://jsperf.com/replace-characters-in-string - iabw
显示剩余3条评论
9个回答

613
你需要使用/g(全局)选项,像这样:
var replaced = str.replace(/ /g, '+');

你可以在这里尝试一下。与大多数其他语言不同,JavaScript 默认只替换第一个匹配项。


1
在我看来,这种写法比分割/连接版本更易读。 - bobmoff
1
哦,我的天啊...我尝试了无数次使用“/ /g”或类似的东西,不应该有引号。这让我感到惊讶。 - Zhang

599

这里有一种不需要正则表达式的替代方案:

var str = 'a b c';
var replaced = str.split(' ').join('+');

31
与正则表达式版本相比,这个选定的解决方案在大量替换时速度较慢。请测试发布的3个解决方案:http://jsbin.com/isadi3/2,Firefox 的时间差异很小,而 IE 则有明显差异。所以如果速度很关键且您需要进行大量替换操作,则应使用正则表达式。 - epascarello
51
把字符串中的空格替换为加号:“+”。 - Jitendra Pancholi
4
@JitendraPancholi使用的正则表达式可以替换所有空格,而不仅仅是空格字符。这里的另一个正则表达式答案也是可以的。 - Dagg Nabbit
2
@JitendraPancholi 他想要替换的是“空格”,而不是“空白字符”。在这种情况下,我认为他所说的“空格”只是指空格字符,而不是像/s一样的任何旧的空白字符。特别是因为他是在JavaScript中进行操作,将空格字符(但不是其他空白字符)替换为“+”字符是一种标准的URL编码方式。这可能就是为什么只替换空格字符的正则表达式解决方案比替换所有空白字符的解决方案拥有10倍的投票数的原因。 - Dagg Nabbit
1
如果你的项目中使用了30个空格的URL,那么你需要担心的事情比微调字符串替换更重要。 - Dagg Nabbit
显示剩余14条评论

131
var str = 'a b c';
var replaced = str.replace(/\s/g, '+');

9
比所选择的解决方案更清洁快速;适用于“/ /g”无法处理的情况。 - Autumn Leonard

104

你也可以这样做:

str = str.replace(/\s/g, "+");

看看这个代码片段


请您能否解释一下为什么这是解决问题的好方法。 - Matas Vaitkevicius
1
不是我点的踩,我得到了一项审查任务来检查内容长度。我猜想有些人没有看到解释就直接点了踩而不愿意发表评论。请把你的评论写在回答里。 - Matas Vaitkevicius
好的,我已经在我的回答中添加了 Fiddle。 - Jitendra Pancholi
13
可能的另一个获得负投票的原因是这个回答已经在将近四年前被发布 - default locale
2
@Jitendra Pancholi非常感谢你,你的回答确实帮了我,因为我有一些日语:)空格,我无法用.split(' ').join('+')替换。你的回答确实帮了我。谢谢啊。 - whitesiroi

34

在字符串中使用全局搜索。 使用g标志。

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

来源:replaceAll函数


1
我测试了你回答上面的许多正则表达式,但你的回答是最正确的,因为它还可以替换多个连续的空格。 - O Connor
4
无法正常工作:演示 输入:"hello !!!",期望输出:"hello++++!!!",实际输出:"hello+!!!" - HoldOffHunger

32

使用带有 g 修饰符的正则表达式:

var replaced = str.replace(/ /g, '+');

来自使用JavaScript和ActionScript的正则表达式:

/g启用“全局”匹配。在使用replace()方法时,指定此修饰符以替换所有匹配项,而不仅仅是第一个。


16

您需要寻找一些replaceAll选项。

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

这是使用正则表达式执行replaceAll的方法。

function ReplaceAll(Source, stringToFind, stringToReplace) {
    var temp = Source;
    var index = temp.indexOf(stringToFind);

    while (index != -1) {
        temp = temp.replace(stringToFind, stringToReplace);
        index = temp.indexOf(stringToFind);
    }

    return temp;
}

String.prototype.ReplaceAll = function (stringToFind, stringToReplace) {
    var temp = this;
    var index = temp.indexOf(stringToFind);

    while (index != -1) {
        temp = temp.replace(stringToFind, stringToReplace);
        index = temp.indexOf(stringToFind);
    }

    return temp;

};

4
哇,嗯... 这个可以用一个更简单的成语来表达:str.split(stringToFind).join(stringToReplace) - bobince
1
哇,那太低效了。 - epascarello
@epascarello,实际上这比正则表达式或以上的不忠诚要快得多 :) - Caspar Kleijne
3
@Casper,你看到这个是在哪个浏览器里吗?http://jsbin.com/isadi3/edit 看代码的话,它看起来很慢。出于好奇,我编写了一个快速测试,发现在我测试过的浏览器中,它慢了将近100倍。 - epascarello

7

-3

递归地执行此操作:

public String replaceSpace(String s){
    if (s.length() < 2) {
        if(s.equals(" "))
            return "+";
        else
            return s;
    }
    if (s.charAt(0) == ' ')
        return "+" + replaceSpace(s.substring(1));
    else
        return s.substring(0, 1) + replaceSpace(s.substring(1));
}

4
这里的回答已经提供了更好的解决方案。 - Rodney P. Barbati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接