JavaScript String Заменить регулярным выражением и функцией в качестве аргументов. - PullRequest
10 голосов
/ 06 ноября 2010

Я, кажется, получаю противоречивые советы в книгах, которые я прочитал об этой функции.Мне интересно, если кто-то может уточнить.Например, Николас Закас заявляет, что аргумент функции имеет сигнатуру функции форматирования (match, pos, originalText) (P139: Pro JavaScript для веб-разработчиков, 2-е издание: Wrox)

Он продолжает говорить, когда регулярное выражениеимеет одно совпадение, функция получает три аргумента (как указано выше).Когда имеется несколько групп захвата, каждая совпавшая строка передается в качестве аргумента, причем последние две позиции - это позиция и originalText ...

Затем мы переходим к Дагу Крокфордсу, JavaScript: Хорошие части.(P90): Он снова устанавливает синтаксис в виде строки (searcValue, replaceValue) searchValue может быть регулярным выражением - отличное совпадение. Если replaceValue - функция, первый параметр - сопоставленный текст, затем второй - группа захвата 1, третий -группа захвата 2 и т. д. Здесь есть заметная разница.(т.е. без аргумента позиции)

Я также рассматривал пример в шаблонах проектирования Pro JavaScript (APress P152), который запустил весь процесс перекрестных ссылок.Эти парни (Росс Хармс / Дастин Диаз) довольно бесполезно указывают функцию replaceValue с двумя аргументами, названными a & b.Но это усиливает идею, которую описывает Дуг Крокфорд.

Может ли кто-нибудь подтвердить, является ли описание Николаса Закаса действительно верным вариантом?

Ответы [ 2 ]

8 голосов
/ 06 ноября 2010

Zakas является правильным, предпоследний и последний аргументы pos и originalText. Из изданий ECMA-262 3-го и 5-го (раздел 15.5.4.11):

Если replaceValue является функцией, то для каждой совпавшей подстроки вызовите функцию со следующими m + 3 аргументами. Аргумент 1 - это подстрока, которая соответствует. Если searchValue является регулярным выражением, следующие m аргументы - это все записи в MatchResult (см. 15.10.2.1). Аргумент m + 2 - это смещение в строке, где произошло совпадение, а аргумент m + 3 равен string.

Обратите внимание, что String.prototype.replace был новым в ECMA-262, 3-е издание. Документация MSDN для JScript и документация MDC для JavaScript оба соответствуют этой спецификации.

4 голосов
/ 06 ноября 2010

Спецификация ECMAScript имеет:

String.prototype.replace (searchValue, replaceValue)

Если searchValue является регулярным выражением (объект, свойство [[Class]] которого равно "RegExp"), выполните следующие действия: Если searchValue.global - false, затем строка поиска для первого совпадения регулярного выражения searchValue.Если searchValue.global имеет значение true, тогда ищите строку для всех совпадений регулярного выражения searchValue.Выполните поиск так же, как в String.prototype.match, включая обновление searchValue.LastIndex.Пусть m будет количеством оставленных скобок для захвата в searchValue (NCapturingParens, как указано в 15.10.2.1).

Если searchValue не является регулярным выражением, пусть searchString будет ToString (searchValue) и строкой поиска для первого появленияSearchString.Пусть m будет 0.

Если replaceValue является функцией, то для каждой подходящей подстроки вызовите функцию со следующими m + 3 аргументами.Аргумент 1 - это подстрока, которая соответствует.Если searchValue является регулярным выражением, следующие m аргументов - это все записи в MatchResult (см. 15.10.2.1).Аргумент m + 2 - это смещение в строке, где произошло совпадение, а аргумент m + 3 - строка.Результатом является строковое значение, полученное из исходного ввода путем замены каждой совпавшей подстроки на соответствующее возвращаемое значение вызова функции, преобразованное в строку, если необходимо.

Это немного сбивает с толку, но я думаю,Закас прав.

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