Как заменить все точки в строке, используя JavaScript


426

Я хочу заменить все вхождения точки ( .) в строке JavaScript

Например, у меня есть:

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

Я хочу получить: okay this is a string.

Пока что попробовал:

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

но это заканчивается тем, что вся строка заменяется пробелами.


8
Ответ aefxx является правильным, но подобно тому , как FYI является то , что период символ в регулярном выражении средств соответствуют всем , что все находится пространством. Избавление от обратной косой черты означает совпадение по периодам.
swiliams

Спасибо за совет. У меня есть некоторые моменты AHA (при создании приложения) с Regex. Я действительно ненавижу _ , у вас есть какой - нибудь классный, хороший учебник?
Омар Абид

rubular.com - это то, что вы ищете
LanguagesNamedAfterCofee

1
Не используйте регулярные выражения для чего-то такого тривиального.
Стивен Лу

К сожалению, это не похоже на то, что не-регулярное выражение может заменить строку несколько раз.
Стивен Лу

Ответы:


777

Вы должны избегать, .потому что это имеет значение «произвольного символа» в регулярном выражении.

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

25
просто чтобы уточнить, \ экранирует специальные символы в регулярных выражениях, таких как. в этом случае
Realgt

выглядит как седь .. как-то .. :)
Paschalis

в выражении reagukar точка. значит все, это правильное решение!
Бенджамин Фуэнтес

1
@ Kingalione Что именно не работает? Не могли бы вы уточнить?
aefxx

1
@Webwoman Вот для чего используется gмодификатор в конце выражения. Думайте об этом как (g) лобально.
AEFXX

302

Еще одно решение, которое легко понять :)

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

25
@HaggleLad, потому что вам не нужно связываться с регулярным выражением
ton.yeung

5
Разве это не намного медленнее, чем регулярное выражение?
Джаспер Кеннис

1
@ Джаспер, насколько я понимаю, на самом деле это быстрее в большинстве браузеров, хотя я сам не тестировал его.
Андрей

9
@BetoFrega Ничего подобного некоторым эмпирическим данным, чтобы обосновать ваше мнение :). Спасибо за предоставленную ссылку!
testing123

3
Если вы используете RegExp, вы хотите сохранить регулярное выражение в отдельной переменной вне цикла. Компиляция / интерпретация регулярного выражения занимает некоторое время, но после компиляции его можно использовать довольно быстро. Пожалуйста, попробуйте эти тесты, которые я сделал: 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('.', ' '));

Быстрее, чем с помощью регулярных выражений ...

РЕДАКТИРОВАТЬ:
Может быть, в то время, когда я сделал этот код, я не использовал jsperf. Но, в конце концов, такое обсуждение совершенно бессмысленно, разница в производительности не стоит разборчивости кода в реальном мире, поэтому мой ответ остается в силе, даже если производительность отличается от подхода регулярных выражений.

РЕДАКТИРОВАТЬ 2:
Я создал библиотеку, которая позволяет вам сделать это, используя свободный интерфейс:

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

См. Https://github.com/FagnerMartinsBrack/str-replace .


1
Очень полезный. К вашему сведению: после точки с запятой в заявлении о предупреждении присутствуют мошеннические символы.
Патрик

Что ты имеешь в виду под "мошенническим персонажем"?
Фагнер Брак

1
Он означает сущность & # 8203; дважды, то есть символ Unicode 'ZERO WIDTH SPACE' (U + 200B). Больше информации на fileformat.info/info/unicode/char/200b/index.htm
Cœur

@FagnerBrack Вы, вероятно, должны str.toLowerCase()выйти из цикла по соображениям производительности. Кроме того, манипулирование искомой строкой, вероятно, не оптимально. Я опубликовал ответ с измененной версией: stackoverflow.com/questions/2390789/…
sstur

@sstur Я полагаю, что после манипуляции необходимо снова выполнить строчную строку. Манипулирует ли строка, которую я ищу, значительной разницей в производительности? Я полагаю, что разборчивость выходит за рамки преимуществ (не проверено).
Фагнер Брак


15

Для этого простого сценария я бы также рекомендовал использовать методы, встроенные в javascript.

Вы можете попробовать это:

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

Приветствую


6

Я добавляю двойную обратную косую черту к точке, чтобы она работала. Не унывайте.

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

4

Это более сжато / читабельно и должно работать лучше, чем опубликованное Фагнером Брэком (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)'));

1
На самом деле, похоже, что экранированный RegEx работает лучше, чем indexOf! Неправильно звучит, но JSPerf указывает, что это намного быстрее: jsperf.com/replaceall-indexof-vs-regex
sstur

Возможно, в то время, когда я делал этот код, я не использовал jsperf. Но в конце концов такое обсуждение совершенно бессмысленно, разница в производительности не стоит разборчивости кода в реальном мире, поэтому мой ответ остается в силе.
Фагнер Брак

2
String.prototype.replaceAll = function(character,replaceChar){
    var word = this.valueOf();

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

    return word;
}

3
не будет ли это застревает в бесконечном цикле , если вы даете ему что - то вроде: replaceAll('&', '&')? (по общему признанию это не случай в вопросе OP)
Anentropic

Но "& amp;" содержит &цикл, поэтому в цикле никогда не заканчивается замена (и строка продолжает расти). Я попробовал это только сейчас, и он заблокировал мой браузер ...
Anentropic

2

Вот еще одна реализация 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 ("Джордж", "Майкл");


1
Это не обрабатывает поиск / замену без учета регистра. Так что это функционально эквивалентно:string.split(stringToFind).join(stringToReplace)
sstur

0

Пример: я хочу заменить все двойные кавычки (") на одинарные кавычки ('), тогда код будет таким

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

0

@ 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


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


-1

Вы можете заменить любое вхождение любой строки / символа, используя объект javasscript RegExp.

Вот код,

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

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

while(patt.test(mystring)){

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

}

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

Чтобы избежать HTML, используйтеcreateTextNode
Downgoat
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.