Se sua regex for global e você estiver capturando, deverá usar exec. Match não retornará todas as suas capturas.
A correspondência funciona muito bem quando apenas corresponde (não captura). Você o executa uma vez e fornece um array de todas as correspondências. (embora se a regex não for global, a correspondência mostrará a correspondência seguida por capturas)
Exec é o que você usa quando está capturando, e cada vez que é executado dá a correspondência, seguida pelas capturas. (a correspondência se comportará de forma a fornecer a correspondência completa seguida por capturas, apenas quando a regex não for global)
Outro uso com Exec é obter o índice ou posição de uma correspondência. Quando você tem uma variável para sua regex, pode usar .lastIndex e obter a posição da correspondência. Um objeto regex tem .lastIndex, e o objeto regex é o que você faz .exec. A correspondência de pontos é feita em uma string e você não poderá fazer o objeto regex ponto lastIndex
Uma string tem a função match, que é passada a um regex. E uma regex, tem a função exec, e é passada uma string
exec você executa várias vezes. jogo você corre uma vez
É bom usar match quando não estiver capturando e ao capturar você pode usar exec, que é mais poderoso porque é bom para obter capturas, mas se você usou match durante a captura, veja que mostra as capturas quando o regex não é global, mas não mostra capturas quando o regex é global.
> "azb".match(/a(z)b/);
[ "azb", "z" ]
> "azb".match(/a(z)b/g);
[ "azb" ]
>
Outra coisa é que se você usar exec, observe que é chamado na regex, então se você usou uma variável para a regex, você tem mais poder
Você não obtém as correspondências quando não usa a variável para o regex, então use a variável para o regex, ao usar 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
>
E com exec, você pode obter o "índice" da correspondência
> 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
>
Então, se você quiser índices ou captura, use exec (tenha em mente que, como você pode ver, com o "índice", o "índice" que ele dá é na verdade uma enésima ocorrência, está contando a partir de 1. Então você pode derivar o indexe subtraindo 1. E como você pode ver, dá 0 - lastIndex de 0 - para não encontrado).
E se você quiser esticar a correspondência, você pode usá-lo quando estiver capturando, mas não quando a regex for global, e quando você fizer isso para isso, o conteúdo da matriz não é todas as correspondências, mas sim o completo partida seguida pelas capturas.
execpara obter todas as sub-seleções.