Элиф это примеры из учебника Раушмайера - PullRequest
0 голосов
/ 30 ноября 2018

Итак, Раушмайер проделал большую работу, обучая JS, но я не могу сосредоточиться на этих двух маленьких злодеях:

function insertName(str, name) {
    return str.replace(
        /NAME/g,
        function (completeMatch, offset) {
            if (offset === 0 ||
                (offset > 0 && str[offset-1] !== '"')) {
                return name;
            } else {
                return completeMatch;
            }
        }
    );
}

function insertName(str, name) {
    var tmpPrefix = ' ';
    str = tmpPrefix + str;
    str = str.replace(
        /([^"])NAME/g,
        function (completeMatch, prefix) {
            return prefix + name;
        }
    );
    return str.slice(tmpPrefix.length); // remove tmpPrefix
}

Может кто-нибудь объяснить мне, как он передает параметр смещения в первом примере, и чтопроисходит с этим?Что означает префикс параметра во втором примере, откуда он взялся?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

String,prototype.replace() может иметь функцию в качестве второго параметра, тогда как первый параметр является регулярным выражением или строкой.Давайте назовем эту функцию A.
Первым параметром A всегда является вся совпадающая подстрока.Второй (третий, четвертый,…) параметр может быть совпадающими группами захвата регулярного выражения.Если группы захвата не определены, этот параметр является смещением, что означает индекс совпадения внутри исходной строки.(См. doc )

. В первом примере RegEx - это /NAME/g, у которого НЕТ группы захвата, а во втором примере RegEx - /([^"])NAME/g, у которого есть группа захвата (определяется скобками ( и )).

0 голосов
/ 30 ноября 2018

offset - это параметр, который передается методом replace в функцию replacement, когда она используется.( См. Задание _функции в качестве параметра для параметров замена функция ).Указывает индекс в строке, где произошло текущее совпадение.

Попробуйте

'abcada'.replace(/a/g, (match,offset)=>console.log(`match="${match}", offset=${offset}`))

Во втором примере регулярное выражение включает в себя группу захвата, поэтому эти ( это в конкретном случае ) также добавляются в качестве параметров сразу послеcompleteMatch.

В примере кода префикс соответствует группе захвата, которая находится прямо перед ИМЯ, и поэтому он называется префиксом ( он захватывает любой односимвольный символ, кроме ")

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