【问题标题】:Replace all spaces in a string with '+' [duplicate]用'+'替换字符串中的所有空格[重复]
【发布时间】:2011-04-17 05:34:55
【问题描述】:

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

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

但它只替换第一次出现。我怎样才能让它替换所有出现的地方?

【问题讨论】:

  • 您是否尝试对字符串进行 URL 编码?如果是这样,最好寻求帮助,而不仅仅是如何处理空格。
  • @Lasse,我想这最终就是我想要做的,因为我想要格式化的字符串最终会成为 URL 的一部分。但是,我认为这个问题仍然有其自身的优点,因为替换字符串中所有出现的子字符串并不是很明显。
  • 对,这也是我的怀疑。答案是:使用encodeURIComponent()。不要尝试用字符串替换自己破解它;这比你想象的要复杂得多。这会将空格编码为%20,而不是+%20 一样有效(实际上更有效,因为它适用于路径组件,而 + 仅表示查询组件中的空格),但如果您希望它看起来更漂亮一点,您可以随时使用 replace(/%20/g, '+')当然之后。您可能很想使用 escape(),因为它确实使用了 +,但它也会将所有非 ASCII 字符都弄错——避免。
  • 我同意这一点,这个问题本身就有优点:) 我只是想知道这是否是你想要结束的地方,可能有更好的解决方案适合你。但是,是的,这个问题本身就很好,这是毫无疑问的。我知道足够多的 javascript 来应付,而且 .replace 并没有取代所有的事件对我来说是新闻。
  • 比较正则表达式和拆分/加入细长字符串。 jsperf.com/replace-characters-in-string

标签: javascript string


【解决方案1】:

您需要/g(全局)选项,如下所示:

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

You can give it a try here。与大多数其他语言不同,JavaScript 默认只替换第一次出现。

【讨论】:

  • 这比拆分/加入版本 imho 具有更好的可读性
  • 哦,天哪……我试了无数次'/ /g'之类的,应该没有引号。让我大吃一惊。
【解决方案2】:

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

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

来自Using Regular Expressions with JavaScript and ActionScript

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

【讨论】:

    【解决方案3】:

    你需要寻找一些 replaceAll 选项

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

    这是一种进行替换的正则表达式方式。

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

    【讨论】:

    • 哇。呃...有一个 much 更简单的习惯用法:str.split(stringToFind).join(stringToReplace).
    • 哇,效率太低了。
    • @epascarello 实际上比正则表达式或更高的 indfedelity 执行方式更快:)
    • @Casper 您在哪个浏览器中看到它? jsbin.com/isadi3/edit 看代码看起来很慢。只是为了好玩,我编写了一个快速测试,它在我测试它的浏览器中慢了 100 倍。
    【解决方案4】:
    var str = 'a b c';
    var replaced = str.replace(/\s/g, '+');
    

    【讨论】:

    • 比选择的解决方案更干净、更快捷;在 / /g 不适用的地方工作。
    【解决方案5】:

    这是不需要正则表达式的替代方法:

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

    【讨论】:

    • 与 reg 表达式版本相比,此选择的解决方案在大替换时速度较慢。使用发布的 3 个解决方案进行测试:jsbin.com/isadi3/2 Firefox 的时间差异很小,IE 有明显的差异。因此,如果速度很重要,并且您有大量替代品,那么 reg exp 就是要走的路。
    • 使用 str = str.replace(/\s/g, "+");
    • @JitendraPancholi 替换所有空格,而不仅仅是空格字符。这里的另一个正则表达式答案很好。
    • @JitendraPancholi 他想替换 空格,而不是“空格”。在这种情况下,我假设 spaces 仅表示空格字符,而不仅仅是像 /s 这样的任何旧空格都会匹配。特别是因为他在 JavaScript 中执行此操作,并且用 + 字符替换空格字符(但不是其他空格)是编码 URL 的标准方法。这可能就是为什么只替换空格字符的正则表达式解决方案的投票数是替换所有空格字符的 10 倍。
    • 如果您的项目使用的 URL 中包含 30 个空格,那么您需要担心的事情比微优化字符串替换更重要。
    【解决方案6】:

    递归执行:

    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));
    }
    

    【讨论】:

    • 这里的答案中已经提供了更好的解决方案。
    【解决方案7】:

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

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

    来源:replaceAll function

    【讨论】:

    • 我已经在你的答案之上测试了许多正则表达式,但你的答案是最正确的,因为它还替换了多个链接空格。
    • 不起作用:Demo 输入:"hello !!!",预期输出:"hello++++!!!",实际输出:"hello+!!!"
    【解决方案8】:

    非破坏性空间问题

    在某些浏览器中

    (MSIE“像往常一样”;-))

    替换字符串中的空格会忽略不间断的空格(160 字符代码)。

    应该总是这样替换:

    myString.replace(/[ \u00A0]/, myReplaceString)
    

    很好的详细解释:

    http://www.adamkoch.com/2009/07/25/white-space-and-character-160/

    【讨论】:

      【解决方案9】:

      你也可以这样做:

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

      看看这个fiddle

      【讨论】:

      • 能否请您解释一下为什么这是解决问题的好方法。
      • 不是我的反对意见,由于内容的长度,我有一个审查任务要检查。我认为要求更高的人没有看到解释并且在不打扰评论的情况下投了反对票。请将您的评论放入答案中。
      • 好的,我在回答中添加了小提琴。
      • 投反对票的另一个可能原因是这个答案是 already posted 差不多四年前
      • @Jitendra Pancholi 非常感谢,你的回答对我有帮助,因为我有一些日语 :) 空格,我无法用 .split(' ').join( '+');你的回答确实帮助了我。谢谢大佬。
      猜你喜欢
      • 2012-01-31
      • 2018-07-09
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 2013-11-21
      相关资源
      最近更新 更多