Кроссбраузерная библиотека регулярных выражений для замены JavaScript с использованием функции - PullRequest
3 голосов
/ 25 февраля 2011

Есть ли библиотека для замены с использованием функций в качестве аргумента

когда я вызываю эту функцию

"foo[10]bar[20]baz".replacef(/\[([0-9]*)\]/g, function(a) {
    return '[' + (ParseInt(a)*10) + ']';
});

должно вернуть

"foo[20]bar[30]baz";

и когда я звоню с этим

"foo[10;5]bar[15;5]baz".replacef(/\[([0-9]*);([0-9]*)\]/g, function(a, b) {
    return '_' + (ParseInt(a)+ParseInt(b)) + '_';
});

должно вернуть

"foo_15_bar_20_baz"

Существует ли библиотека кросс-браузер, которая имеет подобную или похожую функцию в JavaScript?

Ответы [ 2 ]

5 голосов
/ 25 февраля 2011

Вот так уже работает функция replace (). Если вторым параметром является функция, ему передается список аргументов, которые практически совпадают с массивом, возвращаемым функцией RegExp "exec ()". Функция возвращает то, что она хочет, чтобы соответствующая область была заменена.

Первым аргументом вызываемой функции является вся совпадающая строка. Второй и последующие аргументы - это захваченные группы из регулярного выражения (как ваш второй пример). Однако во втором примере вам понадобится функция с еще одним параметром для хранения всей совпадающей строки.

Пример:

var s = "hello world".replace(/(\w+)\s*(\w+)/, function(wholeMatch, firstWord, secondWord) {
  return "first: " + firstWord + " second: " + secondWord;
});
alert(s); // "first: hello second: world"
2 голосов
/ 25 февраля 2011

Насколько я знаю, вы можете легко сделать что-то подобное в javascript:

"foo[10]bar[20]baz".replace(/\[([0-9]+)\]/g, function() {
  return '[' + (parseInt(arguments[1])*10) + ']';
});

Это кросс-браузер afaik (обратите внимание, что parseInt не получил заглавных букв в верхнем регистре p), аргументы содержат совпадение, индекс 0это все, 1 и так далее - захваченные группы.

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