ChatGPT解决这个技术问题 Extra ChatGPT

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

我想替换 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 对于这种微不足道的事情。
不幸的是,它看起来不像非正则表达式可以允许多次替换字符串。

W
Wiktor Stribiżew

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

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

只是为了澄清, \ 转义正则表达式中的特殊字符,如 .在这种情况下
看起来像 sed.. 不知何故.. :)
@Kingalione 究竟什么不起作用?你能详细说明一下吗?
@Webwoman 这就是表达式末尾的 g 修饰符的用途。将其视为(g)全局。
我只想说明,在放入正则表达式进行替换时,不要用引号将其封装起来,mystring.replace('/\./g',' ') 不起作用。
i
insertusernamehere

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

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

@HaggleLad,因为您不需要弄乱正则表达式
这不是比正则表达式慢得多吗?
@Jasper 据我了解,它在大多数浏览器中实际上更快,尽管我自己并没有真正对其进行基准测试。
@BetoFrega 没有什么比一些经验数据更能说明你的情况了:)。感谢您提供链接!
如果您使用 RegExp,您确实希望将正则表达式存储在循环外的单独变量中。编译/解释正则表达式需要一些时间,但一旦编译,它可以很快使用。请尝试我所做的这些测试:jsperf.com/replace-vs-split-join-vs-replaceall/23
F
Fagner Brack
/**
 * 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() 移出循环。此外,操作您正在搜索的字符串可能不是最佳的。我发布了一个带有修改版本的答案:stackoverflow.com/questions/2390789/…
@sstur我想在操作后需要再次小写字符串。操纵我正在搜索的字符串是否在性能上有很大差异?我想易读性超过了好处(未经测试)。
m
macemers
str.replace(new RegExp(".","gm")," ")

非常适合替换功能 =)
V
Victor

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

你可以试试这个:

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

问候


k
kittichart

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

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

s
sstur

这更简洁/可读,并且应该比 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。但最后这样的讨论是完全没有意义的,性能差异不值得代码在现实世界中的易读性,所以我的回答仍然有效。
R
Raz

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() 在我看来更具可读性。

(*) 表示它将匹配所有出现的事件。

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

使用正则表达式时,您必须设置全局(“g”)标志;否则,它将抛出 TypeError:“replaceAll 必须使用全局 RegExp 调用”。


我比最佳答案更喜欢这个,因为它基本相同但更简单,因为它表明您不必为这么简单的事情使用正则表达式。 (我不确定为什么大多数答案都假设您需要使用正则表达式)
考虑与旧浏览器的兼容性很重要。我在生产中使用它,因此不得不使用 RegEx 或 split('.').join('') 将其更改为 replace
J
Joel
String.prototype.replaceAll = function(character,replaceChar){
    var word = this.valueOf();

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

    return word;
}

如果你给它这样的东西,这不会陷入无限循环: replaceAll('&', '&') ? (诚然,这不是 OP 的问题)
但是“&”包含一个 & 所以循环永远不会用完要替换的东西(并且字符串会不断增长)。我刚刚试了一下,它锁定了我的浏览器......
s
scripto

这是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)
B
Brandon Anzaldi

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

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

A
A T

@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


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

I
Idan
mystring.replace(new RegExp('.', "g"), ' ');

V
Vinod Kumar

最简单的方法

"先生".split('.').join("");

.....................

安慰

https://i.stack.imgur.com/tYWHW.png


t
tomvodi

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

这是代码,

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

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

while(patt.test(mystring)){

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

}

n
nagender pratap chauhan

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

让数据 = a.replaceAll(".","");

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

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


N
Neha
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