如何使用JavaScript替换字符串中的所有点


426

我想替换.JavaScript字符串中所有出现的dot()

例如,我有:

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

我想得到:okay this is a string

到目前为止,我尝试了:

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

但这最终将所有字符串替换为空格。


8
aefxx的答案是正确的,但就像一个供参考的FYI一样,正则表达式中的句点字符表示匹配所有内容,因此所有内容都是空格。使用反斜杠转义表示匹配句点。
swilliams 2010年

谢谢你的提示。我在Regex上有一些AHA时刻(在构建应用程序时)。我真的很讨厌_,您有一些很棒的好教程吗?
奥马尔·阿比德

rubular.com就是您的寻找
LanguagesNamedAfterCofee

1
不要将正则表达式用于这种琐碎的事情。
史蒂文·卢

不幸的是,它看起来不像非正则表达式可以多次替换字符串。
史蒂文·卢

Answers:


777

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

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

25
只是为了澄清,\会在正则表达式中转义特殊字符,例如。在这种情况下
realgt 2011年

看起来像sed ..莫名其妙的.. :)
Paschalis

用reagukar表示点。就是全部,这是正确的解决方案!
本杰明·富恩特斯

1
@Kingalione到底什么不起作用?您能详细说明一下吗?
aefxx '17

1
@Webwoman这就是g表达式末尾的修饰符的作用。认为它是(g)整体上的。
aefxx

301

一种易于理解的解决方案:)

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

25
@HaggleLad,因为您无需搞砸正则表达式
ton.yeung 2012年

5
这不是比正规化慢很多吗?
贾斯珀·肯尼斯

1
根据我的理解,@ Jasper,虽然我自己还没有对它进行基准测试,但实际上在大多数浏览器中它的运行速度都更快。
安德鲁(Andrew)2012年

9
@BetoFrega没什么像一些经验数据可以说明您的情况的:)。感谢您提供链接!
test123 2012年

3
如果使用RegExp,则确实要将正则表达式存储在循环外的单独变量中。编译/解释一个正则表达式需要花费一些时间,但是一旦被编译,就可以很快地使用它。请尝试我做的这些测试:jsperf.com/replace-vs-split-join-vs-replaceall/23
sanderd17

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,使您可以使用流畅的界面执行此操作:

replace('.').from('okay.this.is.a.string').with(' ');

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


1
很有用。仅供参考:警报语句中的分号后面有流氓字符。
Patrick

您对“流氓角色”的意思是什么?
Fagner Brack

1
他的意思是实体​ 两次,即Unicode字符“零宽度空间”(U + 200B)。有关更多信息fileformat.info/info/unicode/char/200b/index.htm
心教堂

@FagnerBrack str.toLowerCase()出于性能原因,您可能应该移出循环。另外,处理要搜索的字符串可能也不是最佳选择。我张贴的答案与修改后的版本:stackoverflow.com/questions/2390789/...
sstur

@sstur我想需要在操作后再次小写该字符串。操作正在搜索的字符串在性能上有很大的不同吗?我认为可读性超过了收益(未经测试)。
Fagner Brack 2014年


15

对于这种简单的情况,我还建议使用javascript内置的方法。

您可以尝试这样:

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

问候


6

我在点上添加双反斜杠以使其起作用。欢呼。

var st = "okay.this.is.a.string";
var Re = new RegExp("\\.","g");
st = st.replace(Re," ");
alert(st);

4

这更加简洁/易读,并且应该比Fagner Brack发布的效果更好(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表示速度要快得多:jsperf.com/replaceall-indexof-vs-regex
sstur 2013年

也许当时我没有使用jsperf。但是最后这样的讨论是完全没有意义的,性能差异不值得在现实世界中看清楚代码,因此我的回答仍然有效。
Fagner Brack 2014年

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年

但是“&” 包含一个,&因此循环永远不会用完要替换的东西(并且字符串不断增长)。我刚刚尝试过,它锁定了我的浏览器...
Anentropic

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

然后,您可以使用它:

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


1
这不能处理不区分大小写的搜索/替换。因此,它在功能上等同于:string.split(stringToFind).join(stringToReplace)
sstur

0

示例:我想将所有双引号(“)替换为单引号('),然后代码将如下所示

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

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


-1

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

这是代码,

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

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

while(patt.test(mystring)){

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

}

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

要转义HTML,请使用createTextNode
Downgoat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.