Замена токена в JavaScript - PullRequest
1 голос
/ 17 мая 2010

Что мне нужно реализовать, это

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

Объяснить

для примера у меня есть массив шаблонов

paterns = [/Mr\.\s/,/Mrs\.\s/];


stringSubject = "Mr. john is an expert. mrs. john is no less. mr. watson know this very well";

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

stringSubject = "{1} john is an expert. {2} john is no less. {3} watson know this very well";

и массив токенов может выглядеть как

tokens = ["Mr.","mr.","mrs."]

stringSubject = "{1} john is an expert. {3} john is no less. {2} watson know this very well";

// после обработки stringSubject

токены заменяются так, что

stringSubject = "Mr. john is an expert. mrs. john is no less. mr. watson know this very well";

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

Как это можно сделать с помощью регулярных выражений?

1 Ответ

2 голосов
/ 17 мая 2010

Как это?

var stringSubject = "Mr. john is...",
    patterns = [/Mr\.\s/, /Mrs\.\s/],
    currentTokenIndex = 0,
    tokens = [/* this is where the matches will be stored */];

for (var i = -1, l = patterns.length; ++i < l;) {
    stringSubject = stringSubject.replace(patterns[i], function(match){
        tokens[currentTokenIndex] = match;
        return '{' + currentTokenIndex++ + '}';
    });
}

stringSubject; // <= "{0}john is..."

// Later:
stringSubject = stringSubject.replace(/\{(\d+?)\}/g, function(match, index){
    return tokens[index];
});

stringSubject; // <= "Mr. john is..."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...