Javascript Не захватывающее регулярное выражение

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


Это то, что у меня есть.

Строка: <p model='cat'></p>

Regex: .match(/(?:model=')(.*)(?:')/g)

Это то, что возвращает мое выражение: model='cat'

Это то, что я хочу: cat


Почему моя группа non capture не игнорируется? Неужели я не понимаю, что делает группа, не связанная с захватом? Почему мое Regex не работает?

Ответы

Ответ 1

Весь матч всегда будет группой 0, вам нужно получить доступ к этой конкретной группе (группа 1 в этом случае, так как первая группа не является захватом), вы можете сделать это следующим образом:

var str = "<p model='cat'></p>";
var regex = /(?:model=')(.*)(?:')/g
var match = regex.exec(str);
alert(match[1]);  // cat

Fiddle

Кроме того, я полагаю, вы, вероятно, хотите несколько совпадений в строке str, вы можете сделать это вот так:

var str = "<p model='cat'></p><p model='dog'></p><p model='horse'></p>";
var regex = /(?:model=')([^']*)/g
var matches = [];
var match;
while (match = regex.exec(str)) {
    matches.push(match[1]);
}
alert(matches); // cat,dog,horse

Fiddle