Como substituir todos os pontos em uma string usando JavaScript

426

Eu quero substituir todas as ocorrências de um ponto ( .) em uma string JavaScript

Por exemplo, eu tenho:

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

Eu quero começar: okay this is a string.

Até agora eu tentei:

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

mas isso acaba com toda a cadeia substituída por espaços.

Omar Abid
fonte
8
A resposta de aefxx está correta, mas, da mesma forma que para um FYI, o caractere de ponto final em uma regex significa combinar tudo , portanto, tudo sendo um espaço. Escapá-lo com a barra invertida significa corresponder a períodos.
swilliams
Obrigado pela dica. Eu tenho alguns momentos da AHA (ao criar o aplicativo) com o Regex. Eu realmente odeio isso _ , você tem algum tutorial legal e bom?
Omar Abid
rubular.com é o que você procura
LanguagesNamedAfterCofee
1
Não use um regex para algo tão trivial.
Steven Lu
Infelizmente, parece que um não-regex pode permitir a substituição de uma sequência várias vezes.
Steven Lu

Respostas:

777

Você precisa escapar do .porque ele tem o significado de "um caractere arbitrário" em uma expressão regular.

mystring = mystring.replace(/\./g,' ')
aefxx
fonte
25
apenas para esclarecer, o \ escapa caracteres especiais em expressões regulares, como o. neste caso
realgt 27/09/11
parece com sed .. de alguma forma .. :)
Paschalis
na expressão reagukar o ponto. significa tudo, esta é a solução correta!
Benjamin Fuentes
1
@Kingalione O que exatamente não funciona? Você poderia elaborar?
aefxx
1
@Webwoman É para isso que o gmodificador no final da expressão é usado. Pense nisso como (g) globalmente.
aefxx
302

Mais uma solução fácil de entender :)

var newstring = mystring.split('.').join(' ');
Umesh Patil
fonte
25
@HaggleLad porque você não precisa mexer com regex
ton.yeung
5
Não é muito mais lento do que isso?
Jasper Kennis
1
@ Jasper do meu entendimento, é realmente mais rápido na maioria dos navegadores, embora eu mesmo não tenha comparado.
58580 Andrew
9
@BetoFrega Nada como alguns dados empíricos para fazer o seu caso :). Obrigado por fornecer o link!
testing123
3
Se você usa o RegExp, deseja armazenar o regex em uma variável separada fora do loop. Compilar / interpretar um regex leva algum tempo, mas uma vez compilado, ele pode ser usado rapidamente. Por favor, tente esses testes que fiz: 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('.', ' '));

Mais rápido do que usar regex ...

Edição:
Talvez no momento em que eu fiz esse código, não usei o jsperf. Mas, no final, essa discussão é totalmente inútil, a diferença de desempenho não vale a legibilidade do código no mundo real; portanto, minha resposta ainda é válida, mesmo que o desempenho seja diferente da abordagem regex.

EDIT2:
Criei uma biblioteca que permite fazer isso usando uma interface fluente:

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

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

Fagner Brack
fonte
1
Muito útil. FYI: Existem caracteres não autorizados após o ponto e vírgula na declaração de alerta.
Patrick
O que você quer dizer com "personagem desonesto"?
Fagner Brack #
1
Ele quer dizer entidade & # 8203; duas vezes, que é o caractere Unicode 'ZERO WIDTH SPACE' (U + 200B). Mais informações em fileformat.info/info/unicode/char/200b/index.htm
Cœur
@FagnerBrack Você provavelmente deve str.toLowerCase()sair do circuito por razões de desempenho. Além disso, manipular a string que você está pesquisando provavelmente é menos do que ideal. Eu
publiquei
@stur Suponho que seja necessário diminuir a string novamente após a manipulação. Está manipulando a string que estou procurando uma diferença considerável no desempenho? Suponho que a legibilidade repasse os benefícios (não testados).
Fagner Brack
22
str.replace(new RegExp(".","gm")," ")
Macemers
fonte
1
Funcionou muito bem para a função de substituição =)
afreeland
15

Para esse cenário simples, eu também recomendaria usar os métodos que vêm embutidos em javascript.

Você pode tentar o seguinte:

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

saudações

Vencedor
fonte
6

Eu adiciono barra invertida dupla ao ponto para fazê-lo funcionar. Torcer.

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

Isso é mais conciso / legível e deve ter um desempenho melhor que o publicado por Fagner Brack (o toLowerCase não é executado em 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);
}

Uso:

alert('Bananas And Bran'.replaceAll('An', '(an)'));
sstur
fonte
1
Na verdade, parece que o RegEx com escape tem um desempenho melhor que o indexOf! Não soa bem, mas JSPerf indica que é muito mais rápido: jsperf.com/replaceall-indexof-vs-regex
SSTUR
Talvez, na época em que fiz esse código, não usasse o jsperf. Mas, no final, essa discussão é totalmente inútil, a diferença de desempenho não vale a legibilidade do código no mundo real, então minha resposta ainda é válida.
Fagner Brack
2
String.prototype.replaceAll = function(character,replaceChar){
    var word = this.valueOf();

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

    return word;
}
Joel
fonte
3
isso não ficará preso em um loop infinito se você der algo como replaceAll('&', '&'):? (reconhecidamente que não é um caso em questão do OP)
Anentropic
Mas "& amp;" contém um &para que o loop nunca fique sem itens a serem substituídos (e a cadeia continua crescendo). Eu tentei apenas agora e trancado meu navegador ...
Anentropic
2

Aqui está outra implementação de replaceAll. Espero que ajude alguém.

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

Então você pode usá-lo:

var myText = "Meu nome é George";
var newText = myText.replaceAll ("George", "Michael");

scripto
fonte
1
Isso não lida com pesquisa / substituição que não diferencia maiúsculas de minúsculas. Portanto, é funcionalmente equivalente a:string.split(stringToFind).join(stringToReplace)
sstur
0

Exemplo: Desejo substituir todas as aspas duplas (") por aspas simples (') Então o código será assim

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

O @ scripto tornou-se um pouco mais conciso e sem 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;
}

Veja como ele se comporta : http://jsperf.com/replace-vs-split-join-vs-replaceall/68

AT
fonte
0
String.prototype.replaceAll = function (needle, replacement) {
    return this.replace(new RegExp(needle, 'g'), replacement);
};
Danon
fonte
0
mystring.replace(new RegExp('.', "g"), ' ');
Idan
fonte
-1

você pode substituir toda a ocorrência de qualquer sequência / caractere usando o objeto javasscript RegExp.

Aqui está o código,

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

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

while(patt.test(mystring)){

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

}
Rakesh Chaudhari
fonte
-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, "'");
} 
Neha
fonte
Para escapar do HTML, usecreateTextNode
Downgoat