Замена нескольких шаблонов в блоке данных - PullRequest
8 голосов
/ 23 марта 2010

Мне нужно найти наиболее эффективный способ сопоставления нескольких регулярных выражений в одном блоке текста. Чтобы привести пример того, что мне нужно, рассмотрим блок текста:

«Привет, мир, какой прекрасный день»

Я хочу заменить Hello на "Bye" и "World" на Universe. Я всегда могу сделать это в цикле, используя что-то вроде функций String.replace, доступных на разных языках.

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

Мне было интересно, могу ли я использовать регулярные выражения, чтобы сделать это эффективно, или мне нужно использовать парсер, подобный LALR.

Мне нужно сделать это в JavaScript, поэтому, если кто-нибудь знает инструменты, которые могут это сделать, это будет оценено.

Ответы [ 3 ]

11 голосов
/ 23 марта 2010

Редактировать

Через 6 лет после моего первоначального ответа (ниже) я бы решил эту проблему по-другому

function mreplace (replacements, str) {
  let result = str;
  for (let [x, y] of replacements)
    result = result.replace(x, y);
  return result;
}

let input = 'Hello World what a beautiful day';

let output = mreplace ([
  [/Hello/, 'Bye'],
  [/World/, 'Universe']
], input);

console.log(output);
// "Bye Universe what a beautiful day"

Это имеет огромное преимущество перед предыдущим ответом, который требовал от вас писать каждый матч дважды. Это также дает вам индивидуальный контроль над каждым матчем. Например:

function mreplace (replacements, str) {
  let result = str;
  for (let [x, y] of replacements)
    result = result.replace(x, y);
  return result;
}

let input = 'Hello World what a beautiful day';

let output = mreplace ([
  //replace static strings
  ['day', 'night'],
  // use regexp and flags where you want them: replace all vowels with nothing
  [/[aeiou]/g, ''],
  // use captures and callbacks! replace first capital letter with lowercase 
  [/([A-Z])/, $0 => $0.toLowerCase()]

], input);

console.log(output);
// "hll Wrld wht  btfl nght"

Оригинальный ответ

Andy E Ответ можно изменить, чтобы упростить добавление заменяющих определений.

var text = "Hello World what a beautiful day";
text.replace(/(Hello|World)/g, function ($0){
  var index = {
    'Hello': 'Bye',
    'World': 'Universe'
  };
  return index[$0] != undefined ? index[$0] : $0;
});

// "Bye Universe what a beautiful day";
9 голосов
/ 23 марта 2010

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

var hello = "Hello World what a beautiful day";
hello.replace(/Hello|World/g, function ($0, $1, $2) // $3, $4... $n for captures
{
    if ($0 == "Hello")
        return "Bye";
    else if ($0 == "World")
        return "Universe";
});

// Output: "Bye Universe what a beautiful day";
1 голос
/ 06 февраля 2015

Улучшенный ответ:

var index = {
    'Hello': 'Bye',
    'World': 'Universe'
};

var pattern = '';
for (var i in index) {
    if (pattern != '') pattern += '|';
    pattern += i;
}

var text = "Hello World what a beautiful day";
text.replace(new RegExp(pattern, 'g'), function($0) {
    return index[$0] != undefined ? index[$0] : $0;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...