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

Posted

技术标签:

【中文标题】如何使用 JavaScript 替换字符串中的所有点【英文标题】:How to replace all dots in a string using JavaScript 【发布时间】:2011-01-24 08:23:52 【问题描述】:

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

例如,我有:

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

我想得到:okay this is a string

到目前为止我尝试过:

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

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

【问题讨论】:

aefxx 的答案是正确的,但正如仅供参考一样,正则表达式中的句点字符意味着匹配 一切,因此一切都是空格。用反斜杠转义它意味着匹配句点。 感谢您的提示。我有一些使用 Regex 的 AHA 时刻(在构建应用程序时)。我真的很讨厌它_,你有一些很酷的好教程吗? rubular.com 就是您要找的东西 Don't use a regex 为这个微不足道的事情。 不幸的是,看起来非正则表达式不允许多次替换字符串。 【参考方案1】:

a = "曾经有一个国王。传播运算符。让。版本。常量。";

data = a.replaceAll(".","");

答案:data = "曾经有一个king spread operator let ver const";

您需要对该字符串使用 replaceAll() 方法。

【讨论】:

【参考方案2】:

replaceAll(search, replaceWith) [MDN]

 ".a.b.c.".replaceAll('.', ' ')
 // result: " a b c "

 // Using RegEx. You MUST use a global RegEx.
 ".a.b.c.".replaceAll(/\./g, ' ')
 // result: " a b c "
    

replaceAll() 将所有出现的search 替换为replaceWith

这实际上与使用带有全局正则表达式(*)的replace() [MDN] 相同,只是replaceAll() 在我看来更具可读性。

(*) 表示它将匹配所有匹配项。


如果您选择正则表达式,则重要():

当使用regexp 时,您必须设置全局 ("g") 标志; 否则,它会抛出一个 TypeError: "replaceAll must be called with 一个全局正则表达式”。

【讨论】:

我比最佳答案更喜欢这个,因为它基本相同但更简单,因为它表明您不必为这么简单的事情使用正则表达式。 (我不确定为什么大多数答案都假设您需要使用正则表达式) 重要的是要考虑与旧浏览器的兼容性。我在生产中使用它,因此不得不使用 RegEx 或 split('.').join('') 将其更改为 replace【参考方案3】:

最简单的方法

"Mr.".split('.').join("");

.......

控制台

【讨论】:

【参考方案4】:
mystring.replace(new RegExp('.', "g"), ' ');

【讨论】:

【参考方案5】:

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

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

【讨论】:

只是为了澄清, \ 转义正则表达式中的特殊字符,如 .在这种情况下 看起来像 sed.. 不知何故.. :) 在 reagukar 表达式中的点。意味着一切,这是正确的解决方案! @Kingalione 究竟什么不起作用?你能详细说明一下吗? @Webwoman 这就是表达式末尾的g 修饰符的用途。将其视为(g)全局。【参考方案6】:
String.prototype.replaceAll = function (needle, replacement) 
    return this.replace(new RegExp(needle, 'g'), replacement);
;

【讨论】:

【参考方案7】:
/**
 * 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: 我创建了一个库,允许您使用流畅的界面执行此操作:

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

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

【讨论】:

非常有用。仅供参考:警报语句中的分号后面有流氓字符。 “流氓角色”是什么意思? 他的意思是实体 & #8203 ;两次,即 Unicode 字符“零宽度空间”(U+200B)。更多信息fileformat.info/info/unicode/char/200b/index.htm @FagnerBrack 出于性能原因,您可能应该将str.toLowerCase() 移出循环。此外,操作您正在搜索的字符串可能不是最佳的。我发布了一个修改版本的答案:***.com/questions/2390789/… @sstur 我想在操作后需要再次小写字符串。操纵我正在搜索的字符串是否在性能上有很大差异?我想易读性超过了好处(未经测试)。【参考方案8】:

@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

【讨论】:

【参考方案9】:

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

这是代码,

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

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

while(patt.test(mystring))

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


【讨论】:

【参考方案10】:

例子:我想把所有双引号(")都换成单引号(') 那么代码会是这样的

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

【讨论】:

【参考方案11】:

对于这个简单的场景,我还建议使用内置在 javascript 中的方法。

你可以试试这个:

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

问候

【讨论】:

【参考方案12】:
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【参考方案13】:

这更简洁/可读,并且应该比 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)'));

【讨论】:

实际上,转义的 RegEx 似乎比 indexOf 执行得更好!听起来不对,但 JSPerf 表明它更快:jsperf.com/replaceall-indexof-vs-regex 也许当时我没有使用 jsperf。但最终这样的讨论是完全没有意义的,性能差异不值得代码在现实世界中的易读性,所以我的回答仍然有效。【参考方案14】:

这里是 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");

【讨论】:

这不处理不区分大小写的搜索/替换。所以它在功能上等价于:string.split(stringToFind).join(stringToReplace)【参考方案15】:
String.prototype.replaceAll = function(character,replaceChar)
    var word = this.valueOf();

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

    return word;

【讨论】:

如果你给它这样的东西,它不会陷入无限循环:replaceAll('&amp;', '&amp;amp;') 吗? (诚​​然,这不是 OP 的问题) 但是“&”包含一个&amp;,因此循环永远不会用完要替换的东西(并且字符串会不断增长)。我刚才试了一下,它锁定了我的浏览器......【参考方案16】:

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

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

【讨论】:

@HaggleLad 因为你不需要弄乱正则表达式 这不是比正则表达式慢很多吗? @Jasper 据我了解,它实际上在大多数浏览器中都更快,尽管我自己并没有实际对其进行基准测试。 @BetoFrega 没有什么比一些经验数据更能说明你的情况了:)。感谢您提供链接! 如果您使用正则表达式,您确实希望将正则表达式存储在循环外的单独变量中。编译/解释一个正则表达式需要一些时间,但是一旦它被编译,它可以很快被使用。请尝试我所做的这些测试:jsperf.com/replace-vs-split-join-vs-replaceall/23【参考方案17】:

我在点上添加双反斜杠以使其工作。加油。

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

【讨论】:

【参考方案18】:
str.replace(new RegExp(".","gm")," ")

【讨论】:

非常适合替换功能 =)

以上是关于如何使用 JavaScript 替换字符串中的所有点的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript javascript替换字符串中的所有实例

如何替换 JavaScript 中所有出现的字符串

如何替换 JavaScript 中所有出现的字符串

如何替换 JavaScript 中所有出现的字符串

如何替换 JavaScript 中所有出现的字符串

如何替换 JavaScript 中所有出现的字符串