487

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.

6
  • 9
    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. Commented Jul 27, 2010 at 16:52
  • 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? Commented Jul 31, 2010 at 1:32
  • rubular.com is what you're looking for Commented Jul 17, 2012 at 15:41
  • 2
    Don't use a regex for something this trivial. Commented May 2, 2013 at 18:42
  • Unfortunately it does not look like a non-regex can allow for replacement of a string multiple times. Commented May 4, 2013 at 23:41

17 Answers 17

910

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

mystring = mystring.replace(/\./g,' ')
Sign up to request clarification or add additional context in comments.

9 Comments

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.
|
323

One more solution which is easy to understand :)

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

7 Comments

@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
|
54
/**
 * 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.

5 Comments

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).
22
str.replace(new RegExp(".","gm")," ")

1 Comment

Worked great for replace function =)
17

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

Comments

6

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

Comments

6

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".

2 Comments

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.
4

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

2 Comments

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.
2
String.prototype.replaceAll = function(character,replaceChar){
    var word = this.valueOf();

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

    return word;
}

2 Comments

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...
2

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

1 Comment

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

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'

Comments

0

@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

Comments

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

Comments

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

Comments

0

Simplest way

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

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

Console

enter image description here

Comments

-1

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(".","");

}

Comments

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

1 Comment

To escape HTML, use createTextNode

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.