Если ваше регулярное выражение является глобальным и вы захватываете, то вы должны использовать exec. Матч не вернет все ваши захваты.
Матч отлично работает, когда просто совпадает (не захватывая). Вы запускаете его один раз, и он дает массив всех совпадений. (хотя, если регулярное выражение не является глобальным, то при совпадении будет отображаться совпадение с последующими захватами)
Exec - это то, что вы используете при захвате, и каждый раз, когда он выполняется, он дает совпадение, а затем захватывает. (совпадение будет вести себя так, чтобы дать полное совпадение с последующим захватом, только когда регулярное выражение не является глобальным).
Другое использование с Exec - получение индекса или позиции совпадения. Когда у вас есть переменная для вашего регулярного выражения, вы можете использовать .lastIndex и получить позицию соответствия. Объект регулярного выражения имеет .lastIndex, а объект регулярного выражения - это то, что вы делаете .exec. Сопоставление точек выполняется в строке, и вы не сможете затем выполнить регулярное выражение объекта dot lastIndex
Строка с функцией соответствия, которой передается регулярное выражение. И регулярное выражение, имеет функцию exec, и передается строка
Exec вы запускаете несколько раз. матч, который вы запускаете один раз
Хорошо использовать сопоставление, когда не выполняется захват, и при захвате можно использовать exec, который является более мощным, так как он полезен для получения захватов, но если вы использовали сопоставление при захвате, посмотрите, что он показывает захваты, когда регулярное выражение не является глобальным , но не показывает захваты, когда регулярное выражение является глобальным.
> "azb".match(/a(z)b/);
[ "azb", "z" ]
> "azb".match(/a(z)b/g);
[ "azb" ]
>
Другое дело, что если вы используете exec, обратите внимание, что он вызывается для регулярного выражения, то, если вы использовали переменную для регулярного выражения, у вас будет больше возможностей
Вы не получите совпадения, если не используете переменную для регулярного выражения, поэтому используйте переменную для регулярного выражения при использовании exec
> /./g.exec("abc")
[ "a" ]
> /./g.exec("abc")
[ "a" ]
> /./g.exec("abc")
[ "a" ]
>
> /[a-c]/g.exec("abc")
[ "a" ]
> /[a-c]/g.exec("abc")
[ "a" ]
>
> var r=/[a-c]/g
> r.exec("abc")
[ "a" ]
> r.exec("abc")
[ "b" ]
> r.exec("abc")
[ "c" ]
> r.exec("abc")
null
>
А с помощью exec вы можете получить «индекс» матча
> var r=/T/g
> r.exec("qTqqqTqqTq");
[ "T" ]
> r.lastIndex
2
> r.exec("qTqqqTqqTq");
[ "T" ]
> r.lastIndex
6
> r.exec("qTqqqTqqTq");
[ "T" ]
> r.lastIndex
9
> r.exec("qTqqqTqqTq");
null
> r.lastIndex
0
>
Так что если вы хотите индексировать или захватывать, то используйте exec (имейте в виду, что, как вы можете видеть, с «index», «index», который он дает, на самом деле является n-м вхождением, он рассчитывает с 1. Так что вы можете получить правильный индекс, вычитая 1. И, как вы можете видеть, он дает 0 - lastIndex = 0 - для не найден).
И если вы хотите растянуть совпадение, вы можете использовать его при захвате, но не тогда, когда регулярное выражение является глобальным, и когда вы делаете это для этого, тогда содержимое массива не все совпадения, но полное совпадение с последующими захватами.