Как поменять подстроки внутри строки? - PullRequest
5 голосов
/ 22 августа 2011

Я пытаюсь поменять местами все вхождения пары подстрок в данной строке.

Например, я могу захотеть заменить все вхождения «coffee» на «tea» и все вхождения «tea»"with" coffee ".

Это первое, о чем я подумал:

var newString = oldString.replace(/coffee/g, "__").replace(/tea/g, "coffee").replace(/__/g, "tea");

Это работает большую часть времени, но если моя входная строка содержит подстроку" __ ", онане будет работать должным образом.

Я ищу что-то, что работает, независимо от того, что я даю, поэтому я подумал еще и придумал:

var pieces = oldString.split("coffee");
for (var i = 0; i < pieces.length; i++)
  pieces[i] = pieces[i].replace(/tea/g, "coffee");
var newString = pieces.join("tea");

Работает нормально, ноэто отчасти уродливо и многословно.Я попытался придумать что-то более лаконичное и использовал функцию map , встроенную в jQuery, чтобы придумать следующее:

var newString = $.map(oldString.split("coffee"), function(piece) {
  return piece.replace(/tea/g, "coffee");
}).join("tea");

Это лучше, но у меня все еще есть чувство, чтоэто какой-то блестяще простой метод, который мне не приходит в голову.Кто-нибудь здесь знает более простой способ?

Ответы [ 4 ]

6 голосов
/ 22 августа 2011

А как же

theString.replace(/(coffee|tea)/g, function($1) {
     return $1 === 'coffee' ? 'tea' : 'coffee';
});

(Лично я думаю, что обмен кофе и чая преступно, но это ваше дело)

2 голосов
/ 22 августа 2011

Вы можете использовать функцию:

var str = "I like coffee more than I like tea";
var newStr = str.replace(/(coffee|tea)/g, function(x) {
   return x === "coffee" ? "tea" : "coffee";
});
alert(newStr); 

Пример выполнения

0 голосов
/ 22 августа 2011

Используйте карту (объект), чтобы определить, что заменяет, а затем функцию, которую нужно нажать на карту:

D:\MiLu\Dev\JavaScript :: type replace.js
function echo(s) { WScript.Echo(s) }
var
map = { coffee: "tea", tea: "coffee" },
str = "black tea, green tea, ice tea, teasing peas and coffee beans";
echo( str.replace( /\b(tea|coffee)\b/g, function (s) { return map[s] } ) );

D:\MiLu\Dev\JavaScript :: cscript replace.js
black coffee, green coffee, ice coffee, teasing peas and tea beans
0 голосов
/ 22 августа 2011

Закрыть.Учтите это:

var newString = oldString.replace("tea|coffee", function(match) {
    // now return the right one, just a simple conditional will do :)
});

Счастливого кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...