В чем разница между функцией RegExps exec() и функцией strings match()?

Если я запустил это:

/([^\/]+)+/g.exec('/a/b/c/d');

Я получаю это:

["a", "a"]

Но если я запустил это:

'/a/b/c/d'.match(/([^\/]+)+/g);

Тогда я получаю ожидаемый результат:

["a", "b", "c", "d"]

Какая разница?

Ответ 1

exec с глобальным регулярным выражением предназначен для использования в цикле, поскольку он все равно будет извлекать все согласованные подвыражения. Итак:

var re = /[^\/]+/g;
var match;

while (match = re.exec('/a/b/c/d')) {
    // match is now the next match, in array form.
}

// No more matches.

String.match делает это для вас и отбрасывает захваченные группы.

Ответ 2

Одна фотография лучше, вы знаете...

re_once = /([a-z])([A-Z])/
re_glob = /([a-z])([A-Z])/g

st = "aAbBcC"
    
document.write("<pre>")
document.write("<br>match once="+ st.match(re_once)+ "  match glob="+ st.match(re_glob))
document.write("<br> exec once="+ re_once.exec(st) + "   exec glob="+ re_glob.exec(st))
document.write("<br> exec once="+ re_once.exec(st) + "   exec glob="+ re_glob.exec(st))
document.write("<br> exec once="+ re_once.exec(st) + "   exec glob="+ re_glob.exec(st))

Ответ 3

/regex/.exec() возвращает только первое найденное совпадение, а "string".match() возвращает все из них, если вы используете флаг g в регулярном выражении.

Смотрите здесь: exec, match.

Ответ 4

Если ваше регулярное выражение является глобальным и вы захватываете его, то вы должны использовать exec. Матч не вернет все ваши захваты.

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

Exec - это то, что вы используете при захвате, и каждый раз, когда он выполняется, он дает совпадение, а затем захватывает. (совпадение будет вести себя так, чтобы дать полное соответствие, за которым следуют захваты, только если регулярное выражение не является глобальным).

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

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