Replace all spaces in a string with '+'
我有一个包含多个空格的字符串。我想用加号替换这些。我想我可以用
1 2
| var str = 'a b c';
var replaced = str.replace(' ', '+'); |
但它只替换第一次出现的内容。我怎样才能让它替换所有发生的事件?
- 是否尝试对字符串进行URL编码?如果是这样的话,最好是寻求帮助,而不仅仅是如何处理这些空间。
- @lass,我想最终这就是我所要做的,作为我想要格式化的字符串,最终将成为URL的一部分。然而,我认为这个问题仍然存在,因为替换字符串中出现的所有子字符串并不是很明显。
- 对,那也是我的怀疑。答案是:使用encodeURIComponent()。不要试图用字符串替换自己来破解它;它比你想象的要复杂得多。这将把空格编码到%20,而不是+。%20和path组件一样有效(实际上更有效,因为它在path组件中工作,而+只意味着查询组件中有一个空间),但是如果你想让它看起来稍微漂亮一点,当然可以在后面做replace(/%20/g, '+')。您可能会尝试使用escape(),因为它确实使用+,但它也会错误地避免所有非ASCII字符。
- 我同意这一点,这个问题本身就是有价值的:)我只是想知道,如果你想在那里结束,可能会有更好的解决方案。但是的,这个问题本身就很好,毫无疑问。我知道有足够多的javascript可以勉强使用,而replace并没有取代所有的事件,这对我来说是个新闻。
- 比较小字符串和长字符串上的regex和split/join。jspef.com/replace-characters-in-string
- 你等了4年才春天来?
这里有一个不需要regex的替代方案:
1 2
| var str = 'a b c';
var replaced = str.split(' ').join('+'); |
- 与Reg Expression版本相比,此选定的解决方案在大替换时速度较慢。使用发布的3个解决方案进行测试:jsbin.com/isadi3/2 firefox有最小的时间差异,ie有显著的差异。因此,如果速度很重要,并且你有大量的替代品,那么RegExp就是一条出路。
- 使用str=str.replace(/s/g,"+");
- @jitendrapancholi替换了所有空格,而不仅仅是空格字符。这里的另一个regex答案是好的。
- @达格纳比:根据问题,他想用+符号替换空白,即使你的解决方案也一样。
- @Jitendrapancholi他想替换空格,而不是"空格"。在这种情况下,我假设他用空格表示的只是空格字符,而不是像/s这样的任何旧空格都会匹配。尤其是因为他在javascript中这样做,用+字符替换空格字符(但不是其他空格)是对URL进行编码的标准方法。这可能就是为什么只替换空格字符的regex解决方案的投票数是替换所有空格的regex解决方案的10倍。
- 如果我们有大量的数据,那么使用split和join是一种开销。因此,如果可能的话,选择一个正则表达式也是很好的。jsfiddle.net/ac5zw
- jsfiddle.net/ac5zw/3在字符串中有制表符、换行符或换行符,我的解决方案适用于所有人。
- 回复:间接费用:见最后一条关于这个问题的评论。在一些浏览器中,少量数据的开销要少得多,这可能正是他要处理的问题。在一些浏览器中,更多。性能在这里是一个无意义的点,随着浏览器在不同版本之间进行调整,一个会变快,另一个会变慢。
- 回复:塔克斯:你没明白我的意思。如果他在做看起来像他在做的事情,他不会希望它把所有这些字符转换成+。他只想转换空间角色。
- 我得到了你的观点,也看了一下比较,如果我们有30个替换,spit/join比regex慢90%,有2个替换,只慢23%。
- 它很可能是一个URL。一个URL中不能有30个空格。
- 如果我把它改为"",我的解决方案会更好。
- 是的,具有文本空间字符的regex解决方案可能更好。这个答案是为了给那些不想使用regex的人一个选择。这就是为什么它以"这里是另一种选择"开头的原因。我忍不住被OP接受了。
- 是的,在下面的评论中提到了这个问题,URL可能有替换,即使我在一个有相同要求的项目上工作。我在URL中有大约30多个替换项。
- 如果您的项目使用的是包含30个空格的URL,那么您要担心的事情就比微优化字符串替换更大。
- @达格纳比:看我解决方案中的最后一条评论。D
- 当regex效率无限高时,split()和join()在这里是非常强大和不必要的。
- 我使用的版本灵感来自trim polyfill str=str.replace(/[sufeffxa0]/g,"+");…伊耶伊
您需要/g选项(全局),如下所示:
1
| var replaced = str.replace(/ /g, '+'); |
你可以在这里试一试。与大多数其他语言不同,默认情况下,javascript只替换第一次出现的语言。
1 2
| var str = 'a b c';
var replaced = str.replace(/\s/g, '+'); |
- 比选择的解决方案更干净、更快;在/ /g不工作的地方工作。
你也可以这样做
1
| str = str.replace(/\s/g,"+"); |
看看小提琴
- @Jitendra Pancholi非常感谢,你的回答确实帮助了我,因为我有一些日语:)空格,我不能用.split("")替换。join("+");你的回答确实帮助了我。谢谢,伙计。
- 你能解释一下为什么这是解决这个问题的好办法吗?
- 不是我投了反对票,因为内容太长,我有一个复习任务要检查。我假设有人要求更高,没有看到解释,也没有费心评论就投了反对票。请把你的评论写下来回答。
- 好的,我在答案中加了小提琴。
- 另一个被否决的可能原因是这个答案在四年前就已经公布了。
在字符串中使用全局搜索。G旗
1
| str.replace(/\s+/g, '+'); |
来源:replaceall函数
使用带有g修饰符的正则表达式:
1
| var replaced = str.replace(/ /g, '+'); |
通过将正则表达式与javascript和actionscript一起使用:
/g enables"global" matching. When using the replace() method, specify this modifier to replace all matches, rather than only the first one.
你需要寻找一些替换选项
1
| str = str.replace(/ /g,"+"); |
这是一种进行替换的正则表达式方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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;
}; |
- 真的。呃。。。有一个更简单的习惯用法:str.split(stringToFind).join(stringToReplace)。
- 哇,那是低效的。
- @实际上,epascarello的速度比regex或indfedelity更快。)
- @卡斯帕,你在什么浏览器里看到的?jsbin.com/isadi3/edit查看代码,它看起来很慢。仅仅是为了好玩,我编写了一个快速测试,在我测试过的浏览器中,它的速度慢了100倍。
不间断空间问题
在某些浏览器中
(msie"通常";-)
替换字符串中的空格将忽略不间断空格(160个字符的代码)。
应始终这样更换:
1
| myString.replace(/[ \u00A0]/, myReplaceString) |
很好的详细解释:
White-space and character 160
递归执行此操作:
1 2 3 4 5 6 7 8 9 10 11 12
| 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));
} |