ChatGPT解决这个技术问题 Extra ChatGPT

How to replace all dots in a string using JavaScript

I want to replace all the occurrences of a dot(.) in a JavaScript string

For example, I have:

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

I want to get: okay this is a string.

So far I tried:

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

but this ends up with all the string replaced to spaces.

aefxx's answer is correct, but just as an FYI is that the period character in a regex means match everything, thus everything being a space. Escaping it with the backslash means match on periods.
Thanks for the tip. I have has some AHA moments (when building the app) with Regex. I really hate it _, do you have some cool, good tutorial?
rubular.com is what you're looking for
Don't use a regex for something this trivial.
Unfortunately it does not look like a non-regex can allow for replacement of a string multiple times.

W
Wiktor Stribiżew

You need to escape the . because it has the meaning of "an arbitrary character" in a regular expression.

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

just to clarify, the \ escapes special characters in regular expressions, like the . in this case
looks like sed.. somehow.. :)
@Kingalione What exactely doesn't work? Could you elaborate?
@Webwoman That's what the g modifier at the end of the expression is used for. Think of it as (g)lobally.
I just want to state that when putting regex in to replace, do not encapsulate it with quotes, mystring.replace('/\./g',' ') doesn't work.
i
insertusernamehere

One more solution which is easy to understand :)

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

@HaggleLad because you don't need to mess with regex
Isn't this much slower than regexing?
@Jasper from my understanding, it's actually faster in most browsers, although I haven't actually benchmarked it myself.
@BetoFrega Nothing like some empirical data to make your case :). Thanks for providing the link!
If you use RegExp, you do want to store the regex in a separate variable outside the loop. Compiling/interpreting a regex takes some time, but once it's compiled, it can be used pretty fast. Please try these tests I made: 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('.', ' '));

Faster than using regex...

EDIT: Maybe at the time I did this code I did not used jsperf. But in the end such discussion is totally pointless, the performance difference is not worth the legibility of the code in the real world, so my answer is still valid, even if the performance differs from the regex approach.

EDIT2: I have created a lib that allows you to do this using a fluent interface:

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

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


Very useful. FYI: There are rogue characters after the semi-colon in the alert statement.
What you mean for "rogue character"?
He means entity & #8203 ; twice, which is Unicode Character 'ZERO WIDTH SPACE' (U+200B). More information on fileformat.info/info/unicode/char/200b/index.htm
@FagnerBrack You should probably move the str.toLowerCase() out of the loop for performance reasons. Also, manipulating the string that you're searching on is probably less than optimal. I posted an answer with a modified version: stackoverflow.com/questions/2390789/…
@sstur I suppose it is required to lowercase the string again after manipulation. Is manipulating the string I am searching a considerable difference in performance? I suppose the legibility goes over the benefits (untested).
m
macemers
str.replace(new RegExp(".","gm")," ")

Worked great for replace function =)
V
Victor

For this simple scenario, i would also recommend to use the methods that comes build-in in javascript.

You could try this :

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

Greetings


k
kittichart

I add double backslash to the dot to make it work. Cheer.

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

s
sstur

This is more concise/readable and should perform better than the one posted by Fagner Brack (toLowerCase not performed in loop):

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

Usage:

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

Actually, it appears escaped RegEx performs better than indexOf! Doesn't sound right, but JSPerf indicates it's much faster: jsperf.com/replaceall-indexof-vs-regex
Maybe at the time I did that code I did not used jsperf. But in the end such discussion is totally pointless, the performance difference is not worth the legibility of the code in the real world, so my answer is still valid.
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() replaces ALL occurrences of search with replaceWith.

It's actually the same as using replace() [MDN] with a global regex(*), merely replaceAll() is a bit more readable in my view.

(*) Meaning it'll match all occurrences.

Important(!) if you choose regex:

when using a regexp you have to set the global ("g") flag; otherwise, it will throw a TypeError: "replaceAll must be called with a global RegExp".


I like this better than the top answer because it's basically the same but simpler since it shows you don't have to use regex for something this simple. (I'm not sure why most answers assume you need to use regex)
It's important to take into account the compatibility with older browsers. I was using this in production and had to change it to replace with RegEx or split('.').join('') because of this.
J
Joel
String.prototype.replaceAll = function(character,replaceChar){
    var word = this.valueOf();

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

    return word;
}

won't this get stuck in an infinite loop if you give it something like: replaceAll('&', '&') ? (admittedly that is not a case in the OP's question)
But "&" contains a & so the loop never runs out of things to replace (and the string keeps on growing). I tried it just now and it locked up my browser...
s
scripto

Here's another implementation of replaceAll. Hope it helps someone.

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

Then you can use it:

var myText = "My Name is George"; var newText = myText.replaceAll("George", "Michael");


This doesn't handle case-insensitive search/replace. So it is functionally equivalent to: string.split(stringToFind).join(stringToReplace)
B
Brandon Anzaldi

Example: I want to replace all double Quote (") into single Quote (') Then the code will be like this

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

A
A T

@scripto's made a bit more concise and without 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;
}

Here's how it stacks up: 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

Simplest way

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

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

Console

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


t
tomvodi

you can replace all occurrence of any string/character using RegExp javasscript object.

Here is the code,

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

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

while(patt.test(mystring)){

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

}

n
nagender pratap chauhan

let a = "once there was a king. spread opeator. let. ver. const.";

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

Answer : data = "once there was a king spread opeator let ver const";

You need to use replaceAll() method on that string.


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

To escape HTML, use createTextNode