2010-03-06 81 views
353

我想更换一个点(.)的所有出现在JavaScript字符串如何使用JavaScript

例如替换字符串中的所有点,我有:

var mystring = 'okay.this.is.a.string'; 

我想得到:okay this is a string

到目前为止,我尝试:

mystring.replace(/./g,' ') 

但最终与替换为空格的所有字符串。

+6

aefxx的答案是正确的,但正如“供参考”一样,正则表达式中的周期字符意味着匹配所有东西,因此所有东西都是空间。使用反斜杠进行转义意味着匹配时段。 – swilliams 2010-07-27 16:52:48

+0

感谢您的提示。使用Regex我有一些AHA时刻(当构建应用程序时)。我真的很讨厌它* _ *,你有一些很酷,很好的教程吗? – 2010-07-31 01:32:03

+0

rubular.com是你正在寻找的 – LanguagesNamedAfterCofee 2012-07-17 15:41:44

回答

636

您需要转义.,因为它在正则表达式中的含义是“任意字符”。

mystring.replace(/\./g,' ') 
+21

可能的重复只是为了澄清,\转义正则表达式中的特殊字符,如。在这种情况下 – realgt 2011-09-27 20:30:09

+0

看起来像sed ..莫名其妙.. :) – Paschalis 2012-07-09 19:23:55

+0

在reagukar表达的点。意味着所有,这一个是正确的解决方案! – 2016-02-19 13:58:07

294

还有一个解决方案,它是很容易理解:)

var newstring = mystring.split('.').join(' '); 
+23

@HaggleLad因为你不需要乱用正则表达式 – 2012-04-04 03:30:21

+5

这是不是比regexing慢? – 2012-06-06 14:10:35

+1

@Jasper从我的理解中,它在大多数浏览器中实际上更快,尽管我自己并没有真正对它进行基准测试。 – andrew 2012-06-26 21:58:47

53
/** 
* ReplaceAll by Fagner Brack (MIT Licensed) 
* Replaces all occurrences of a substring in a string 
*/ 
String.prototype.replaceAll = function(token, newToken, ignoreCase) { 
    var _token; 
    var str = this + ""; 
    var i = -1; 

    if (typeof token === "string") { 

     if (ignoreCase) { 

      _token = token.toLowerCase(); 

      while((
       i = str.toLowerCase().indexOf(
        _token, i >= 0 ? i + newToken.length : 0 
       )) !== -1 
      ) { 
       str = str.substring(0, i) + 
        newToken + 
        str.substring(i + token.length); 
      } 

     } else { 
      return this.split(token).join(newToken); 
     } 

    } 
return str; 
}; 

alert('okay.this.is.a.string'.replaceAll('.', ' ')); 

比使用正则表达式更快...

编辑:
也许在我做的时间这段代码我没有用过jsperf。但最终这样的讨论完全没有意义,性能差异并不值得现实世界中代码的易读性,所以即使性能与正则表达式方法不同,我的答案仍然有效。

EDIT2:
我已经创建了一个lib,允许你做这个用流利的接口:

​​

https://github.com/FagnerMartinsBrack/str-replace

+1

非常有用。仅供参考:警报声明中的分号后面有流氓字符。 – Patrick 2012-11-27 11:24:29

+0

“流氓角色”是什么意思? – 2013-02-06 23:09:09

+1

他意味着实体​两次,这是Unicode字符“零宽度空间”(U + 200B)。更多关于http://www.fileformat.info/info/unicode/char/200b/index.htm的信息 – 2013-02-07 14:07:17

22
str.replace(new RegExp(".","gm")," ") 
+1

工作伟大的替换功能=) – afreeland 2012-07-26 18:09:36

6

我给点加了双反斜杠使之起作用。欢呼。

var st = "okay.this.is.a.string"; 
var Re = new RegExp("\\.","g"); 
st = st.replace(Re," "); 
alert(st); 
2
String.prototype.replaceAll = function(character,replaceChar){ 
    var word = this.valueOf(); 

    while(word.indexOf(character) != -1) 
     word = word.replace(character,replaceChar); 

    return word; 
} 
+3

不会陷入无限循环,如果你给它像这样的东西:'replaceAll('&','&')'? (承认这不是OP的问题) – Anentropic 2013-06-17 14:19:50

+0

但是“&”包含一个'&',所以循环永远不会耗尽要替换的东西(并且字符串不断增长)。我刚刚尝试过,它锁定了我的浏览器... – Anentropic 2013-07-03 09:46:57

2

这里的replaceAll的另一种实现方式。希望它能帮助别人。

String.prototype.replaceAll = function (stringToFind, stringToReplace) { 
     if (stringToFind === stringToReplace) return this; 
     var temp = this; 
     var index = temp.indexOf(stringToFind); 
     while (index != -1) { 
      temp = temp.replace(stringToFind, stringToReplace); 
      index = temp.indexOf(stringToFind); 
     } 
     return temp; 
    }; 

然后你可以使用它:

会将myText VAR = “我的名字是乔治”;
var newText = myText。replaceAll(“George”,“Michael”);

+1

这不处理不区分大小写的搜索/替换。所以它在功能上等同于:'string.split(stringToFind).join(stringToReplace)' – sstur 2013-05-21 04:09:47

4

这是更简洁/可读应该执行一个比张贴由法格纳布拉克(toLowerCase在循环不执行)更好:

String.prototype.replaceAll = function(search, replace, ignoreCase) { 
    if (ignoreCase) { 
    var result = []; 
    var _string = this.toLowerCase(); 
    var _search = search.toLowerCase(); 
    var start = 0, match, length = _search.length; 
    while ((match = _string.indexOf(_search, start)) >= 0) { 
     result.push(this.slice(start, match)); 
     start = match + length; 
    } 
    result.push(this.slice(start)); 
    } else { 
    result = this.split(search); 
    } 
    return result.join(replace); 
} 

用法:

alert('Bananas And Bran'.replaceAll('An', '(an)')); 
+1

实际上,它看起来会被转义RegEx比indexOf更好!听起来不对,但JSPerf表明它更快: http://jsperf.com/replaceall-indexof-vs-regex – sstur 2013-05-21 05:27:39

+0

也许当时我做了代码,我没有使用jsperf。但最终这样的讨论完全没有意义,性能差异不值得现实世界中代码的易读性,所以我的答案仍然有效。 – 2014-01-16 20:32:55

-5
var mystring = 'okay.this.is.a.string'; 
var myNewString = escapeHtml(mystring); 

function escapeHtml(text) { 
if('' !== text) { 
    return text.replace(/&/g, "&") 
       .replace(/&lt;/g, "<") 
       .replace(/&gt;/g, ">") 
       .replace(/\./g,' ') 
       .replace(/&quot;/g, '"') 
       .replace(/&#39/g, "'"); 
} 
+0

要转义HTML,请使用'createTextNode' – Downgoat 2015-06-23 04:09:04

12

对于此简单的情况下,我也建议使用JavaScript中内置的方法。

你可以试试这个:

"okay.this.is.a.string".split(".").join("") 

问候

0

例如:我想更换所有双引号(“)转换成单引号('),然后代码会是这样

var str= "\"Hello\"" 
var regex = new RegExp('"', 'g'); 
str = str.replace(regex, '\''); 
console.log(str); // 'Hello' 
-1

您可以使用RegExp javasscript对象替换所有出现的任何字符串/字符。

下面是代码,

var mystring = 'okay.this.is.a.string'; 

var patt = new RegExp("\\."); 

while(patt.test(mystring)){ 

    mystring = mystring .replace(".",""); 

} 
0

@的Scripto的做一点更简洁,没有prototype

function strReplaceAll(s, stringToFind, stringToReplace) { 
    if (stringToFind === stringToReplace) return s; 
    for (let index = s.indexOf(stringToFind); index != -1; index = s.indexOf(stringToFind)) 
     s = s.replace(stringToFind, stringToReplace); 
    return s; 
} 

下面是它如何:http://jsperf.com/replace-vs-split-join-vs-replaceall/68

0
String.prototype.replaceAll = function (needle, replacement) { 
    return this.replace(new RegExp(needle, 'g'), replacement); 
};