Як замінити всі точки в рядку за допомогою JavaScript


426

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

Наприклад, у мене є:

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

Я хочу отримати: okay this is a string.

Поки я намагався:

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

але це закінчується тим, що всі рядки замінені на пробіли.


8
Відповідь aefxx правильна, але так само, як FYI полягає в тому, що символ періоду в регулярному виразі означає, що відповідає всім , таким чином, все є пробілом. Якщо уникнути її за допомогою нахилу на зворотному напрямку, це означає, що вони відповідають періодам.
swilliams

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

rubular.com - це те, що ви шукаєте
LanguagesNamedAfterCofee

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

На жаль, схоже, що не-регулярний вираз може дозволяти кілька разів замінювати рядок.
Стівен Лу

Відповіді:


777

Вам потрібно уникнути того, .що він має значення "довільний характер" у регулярному виразі.

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

25
просто для уточнення, \ уникає спеціальних символів у регулярних виразах, як-от. у цьому випадку
realgt

схоже на sed .. якось .. :)
Paschalis

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

1
@Kingalione Що різко не працює? Не могли б ви детальніше?
aefxx

1
@Webwoman Саме для цього використовується gмодифікатор в кінці виразу. Подумайте про це (г) на місцевому рівні.
aefxx

301

Ще одне рішення, яке легко зрозуміти :)

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

25
@HaggleLad тому, що вам не потрібно возитися з regex
ton.yeung

5
Хіба це не набагато повільніше, ніж повторне гегерування?
Джаспер Кенніс

1
@Jasper, наскільки я розумію, це в більшості браузерів насправді швидше, хоча я насправді сам цього не орієнтував.
andrew

9
@BetoFrega Нічого подібного до емпіричних даних для вашої справи :). Дякуємо, що надали посилання!
тестування123

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

Швидше, ніж використання регулярних виразів ...

EDIT:
Можливо, тоді, коли я робив цей код, я не використовував jsperf. Але врешті-решт таке обговорення є абсолютно безглуздим, різниця в продуктивності не варте розбірливості коду в реальному світі, тому моя відповідь все-таки справедлива, навіть якщо продуктивність відрізняється від підходу регулярного вираження.

EDIT2:
Я створив ліб, що дозволяє це робити за допомогою вільного інтерфейсу:

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

Дивіться https://github.com/FagnerMartinsBrack/str-replace .


1
Дуже корисний. FYI: У напівкрапці в повідомленні попередження є знаки ізгоїв.
Патрік

Що ви маєте на увазі під "персонажем-шахраєм"?
Fagner Brack

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('&', '&'):? (правда, це не так у питанні ОП)
Анетропік

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

2

Ось ще одна реалізація substituAll. Сподіваюся, це комусь допоможе.

    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

Приклад: Я хочу замінити всі подвійні Quote (") на єдину Quote (') Тоді код буде таким

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

0

@ scripto's зробив трохи більш стисло і без 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.