2010-03-23 1 views
6

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

«Hello World какой прекрасный день»

Я хочу заменить Привет с «Bye» и «Мир» с Вселенной. Я всегда могу сделать это в цикле, используя что-то вроде функций String.replace, доступных на разных языках.

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

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

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

ответ

6

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

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"; 
+0

Только примечание, Andy E: Вам нужен ')' перед вашим ';' на последней строке :) –

+0

@smotchkkiss: Да, я заметил, что как я набрал комментарий внизу и полностью забыл об этом к тому времени, когда я закончил! Спасибо :-) –

+0

Спасибо, это действительно полезно. Тем не менее, регулярные совпадения ограничены $ 1 .. $ 9 или у нас также есть $ 10, $ 11 и т. Д. – VikrantY

10

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

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"

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

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 «s ответ может быть изменен, чтобы сделать добавление определений замены проще.

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"; 
+0

Спасибо Andy/smotchkiss, что вы оба полностью отсортировали мою проблему и избегали мне писать собственный алгоритм для многократной замены. – VikrantY

+2

Возможно, вам не следует воссоздавать объект поиска для каждого вызова функции замены, правильно, но вместо этого использовать его снаружи? – Phrogz

1

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

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; 
}); 
+0

Это старый вопрос со старыми ответами.Я думаю, что вы предлагаете хорошее улучшение, но вы можете увеличить даже большую мощность для пользователя, не заставляя их вводить через конструктор RegExp и автоматически добавляющий флаг 'g'. –

Смежные вопросы