Я не могу точно понять, как работает строка метода JavaScript.матч(регулярного выражения)'работа с г флаг

в книге "JavaScript: хорошие части" он объясняет метод string.match(regexp), как показано ниже:

метод match соответствует строке и регулярному выражению. Как это зависит ли это от флага g. Если нет флага g, то результат вызова строки .match (regexp) - это то же самое, что и вызов регулярное выражение. метод exec( строка ). Однако, если regexp имеет флаг g, то он создает массив всех совпадений, но исключает захват группы:

тогда в книге приведен пример кода:

var text = '<html><body bgcolor=linen><p>This is <b>bold</b>!</p></body></html>';
var tags = /[^<>]+|<(/?)([A-Za-z]+)([^<>]*)>/g;
var a, i;
a = text.match(tags);
for (i = 0; i < a.length; i += 1) {
    document.writeln(('// [' + i + '] ' + a[i]).entityify());
}
// The result is
// [0] <html>
// [1] <body bgcolor=linen>
// [2] <p>
// [3] This is
// [4] <b>
// [5] bold
// [6] </b>
// [7] !
// [8] </p>
// [9] </body>
// [10] </html>

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

в примере кода выше,html на </html> в группе захвата. И почему он все еще включен в массив результатов?

и / на </html> также в группе захвата. И почему он включен в массив результатов?

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

большое спасибо!

2 ответов


в приведенном выше примере кода html находится в группе захвата. И почему он все еще включен в массив результатов?

потому что это полное совпадение. Когда он говорит "но исключает группы захвата", он не имеет в виду полный результат матча, просто содержимое групп захвата не подтвердил в массиве. Если бы группы захвата были включены, вы бы увидели

// The result is
// [0] <html>
// [1]           // From the capture group; nothing here
// [2] html      // From the capture group
// [3]           // From the capture group; nothing here
// ...

и в тоже в группы захвата. И почему он включен в массив результатов?

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

это легче понять с помощью более простого примера. Рассмотрим этот код:

var s = "test1 test2";
var re = /(test)(.)/g;
var r = s.match(re);
var i;
for (i = 0; i < r.length; ++i) {
    console.log("[" + i + "]: '" + r[i] + "'");
}

потому что регулярное выражение имеет g флаг, только полные совпадения включены в массив, поэтому мы видим:

[0]: 'test1'
[1]: 'test2'

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

если мы удалены g флаг, но ничего не изменил, мы получим первое полное совпадение, за которым последует содержимое двух групп захвата:

[0]: 'test1'    // The full match, including the stuff from each capture group
[1]: 'test'     // Capture group 0's contents
[2]: '1'        // Capture group 1's contents

там первая запись-полное совпадение; затем вторая и третья-содержимое групп захвата. Обратите внимание, что содержимое захвата группы


на g модификатор должен применять регулярное выражение глобально. Без этого регулярное выражение и возвращает первое найденное совпадение. С его помощью он ищет и сопоставляет все вхождения в строке.