Не могу понять поведение метода javascript String.match (regexp) - PullRequest
2 голосов
/ 30 января 2012

У меня следующий JS-код:

var str = 'some string';
var rexp = /^([^#]+)/;
var matchArr = str.match(rexp);

matchArr содержит два элемента matchArr [0] = 'some string' и matchArr [1] = 'some string';В то время как я ожидаю массив только с одним элементом.

Я не могу понять это поведение.Когда я удаляю скобки, то matchArr содержит только одно совпадение.Почему это происходит, кто-нибудь может объяснить?

1 Ответ

2 голосов
/ 30 января 2012

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

matchArr[0] - это все, что было найдено.

matchArr[1] - это то, что соответствует первому набору скобок захвата

matchArr[2] - это то, что соответствует второму набору скобок захвата и т. Д.

Итак, в вашем регулярном выражении/^([^#]+)/, нет никакой разницы между matchArr[0] и matchArr[1], потому что все, что соответствует, находится в скобках захвата.

Если вы сделали это:

var str = 'some string';
var rexp = /^some([^#]+)/;
var matchArr = str.match(rexp);

Вы обнаружите, что:

matchArr[0] == "some string";
matchArr[1] == " string";

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

Или, если вы сделали это:

var str = 'some string';
var rexp = /^(some)([^#]+)/;
var matchArr = str.match(rexp);

Вы обнаружите, что:

matchArr[0] == "some string";
matchArr[1] == "some"
matchArr[2] == " string";
...