Я не могу точно понять, как работает строка метода 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
модификатор должен применять регулярное выражение глобально. Без этого регулярное выражение и возвращает первое найденное совпадение. С его помощью он ищет и сопоставляет все вхождения в строке.