Если ваше регулярное выражение глобальное и вы захватываете, вы должны использовать exec. Матч не вернет все ваши захваты.
Match отлично работает, когда просто сопоставляется (а не захватывается). Вы запускаете его один раз, и он дает массив всех совпадений. (хотя, если регулярное выражение не является глобальным, тогда match покажет совпадение, за которым следуют захваты)
Exec - это то, что вы используете при захвате, и каждый раз, когда он выполняется, он дает совпадение, а затем захват. (match будет вести себя таким образом, чтобы дать полное совпадение с последующими захватами, только если регулярное выражение не является глобальным).
Другое использование Exec - получение индекса или позиции совпадения. Когда у вас есть переменная для вашего регулярного выражения, вы можете использовать .lastIndex и получить позицию соответствия. Объект регулярного выражения имеет .lastIndex, а объект регулярного выражения - это то, что вы делаете .exec. Точечное совпадение выполняется в строке, и вы не сможете затем выполнить точку объекта регулярного выражения 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. Так что вы можете получить правильный index путем вычитания 1. И, как вы можете видеть, он дает 0 - lastIndex из 0 - не найдено).
И если вы хотите растянуть совпадение, вы можете использовать его при захвате, но не когда регулярное выражение является глобальным, и когда вы делаете это для этого, тогда содержимое массива не все совпадения, а полное матч с последующими захватами.
exec
чтобы получить все подвыборки.