2010-10-10 2 views
2

Я ищу, чтобы сделать что-то вроде:Перестановка символ для другого в Regex/Javascript

var a = "This is an A B pattern: ABABA"; 
a.replace("A", "B"); 
a.replace("B", "A"); 

и его возвращение:
=> «Это картина БА: BABAB»
вместо :
=> "Это модель AA: AAAAA"

Моя первая мысль сделать что-то вроде:

a.replace("A", "improbablePattern"); 
a.replace("B", "A"); 
a.replace("improbablePattern", "B"); 

Как я должен это делать?

ответ

2

Вы можете передать функцию на свой .replace() вызов с регулярным выражением, которое соответствует как, например:

var a = "This is an A B pattern: ABABA"; 
a = a.replace(/(A|B)/g, function(a, m) { return m == "A" ? "B" : "A"; }); 
alert(a);​ //alerts "This is an B A pattern: BABAB" 

You can try it out here

0

Это не то, что регулярное выражение подходит для. Независимо от того, как вы его поворачиваете, вам нужно по крайней мере три отдельные операции замены, что означает компиляцию и выполнение трех регулярных выражений, и поиск доказуемо не встречного шаблона для промежуточной замены - это проблема. Нет, в этом случае вы должны взять строку отдельно и перевести все символы, которые вы хотите за один раз. Гораздо эффективнее и разумнее.

(То есть, если Javascript не имеет некоторые Perl-подобный tr оператор, который я не знал.)

+1

На самом деле это не так, см. Мой ответ или ответ Гумбо, чтобы опровергнуть теорию тройной замены. –

1

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

String.prototype.translate = function(translation) { 
    var names = []; 
    for (var search in translation) { 
     if (translation.hasOwnProperty(search)) { 
      names.push(search.replace(/([.\\+*?[^\]$(){}=!<>|:\-])/g, "\\$1")); 
     } 
    } 
    var re = new RegExp("(?:" + names.join("|") + ")", "g"); 
    return this.replace(re, function(val) { return translation[val]; }); 
} 

var text = "This is an A B pattern: ABABA", 
    translation = { 
     "A": "B", 
     "B": "A" 
    }; 
text = text.translate(translation); 

Здесь translation отображение из старых на новые значения. Используйте это с описанным здесь методом translate на строках для перевода. Имена свойств прошедшего объекта translation используются для построения регулярного выражения формы (?:name1|name2|…|nameN). Это регулярное выражение затем используется для замены, в то время как дополнительная функция используется для возврата нового значения, соответствующего совпадающему значению.

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