Если я запустил это:
/([^\/]+)+/g.exec('/a/b/c/d');
Я получаю это:
["a", "a"]
Но если я запустил это:
'/a/b/c/d'.match(/([^\/]+)+/g);
Тогда я получаю от этого ожидаемый результат:
["a", "b", "c", "d"]
Какая разница?
javascript
regex
Джастин Варкентин
источник
источник
exec
чтобы получить все подвыборки.+
вариант не нужен, посколькуmatch
он уже вернет все подвыражения..exec
возвращает только один каждый раз, так что это тоже не нужно+
.Ответы:
exec
с глобальным регулярным выражением предназначен для использования в цикле, так как он по-прежнему будет извлекать все совпавшие подвыражения. Так:String.match
делает это за вас и отбрасывает захваченные группы.источник
while(match = /[^\/]+/g.exec('/a/b/c/d')
иначе он создаст бесконечный цикл !. Как четко указано в MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…new RegExp("pattern")
и/pattern/
имелось ввиду разное.Знаешь, одна картинка лучше ...
Увидеть разницу?
источник
/regex/.exec()
возвращает только первое найденное совпадение, а"string".match()
возвращает их все, если вы используетеg
флаг в регулярном выражении.Смотрите здесь: exec , match .
источник
Если ваше регулярное выражение глобальное и вы захватываете, вы должны использовать exec. Матч не вернет все ваши захваты.
Match отлично работает, когда просто сопоставляется (а не захватывается). Вы запускаете его один раз, и он дает массив всех совпадений. (хотя, если регулярное выражение не является глобальным, тогда match покажет совпадение, за которым следуют захваты)
Exec - это то, что вы используете при захвате, и каждый раз, когда он выполняется, он дает совпадение, а затем захват. (match будет вести себя таким образом, чтобы дать полное совпадение с последующими захватами, только если регулярное выражение не является глобальным).
Другое использование Exec - получение индекса или позиции совпадения. Когда у вас есть переменная для вашего регулярного выражения, вы можете использовать .lastIndex и получить позицию соответствия. Объект регулярного выражения имеет .lastIndex, а объект регулярного выражения - это то, что вы делаете .exec. Точечное совпадение выполняется в строке, и вы не сможете затем выполнить точку объекта регулярного выражения lastIndex
Строка имеет функцию сопоставления, которой передается регулярное выражение. И регулярное выражение имеет функцию exec и передается строка
exec вы запускаете несколько раз. матч вы бежите один раз
Хорошо использовать совпадение, когда не выполняется захват, а при захвате вы можете использовать exec, который является более мощным, поскольку он хорош для получения захватов, но если вы использовали совпадение при захвате, убедитесь, что оно показывает захваты, когда регулярное выражение не является глобальным, но не 'не показывать захваты, когда регулярное выражение является глобальным.
Другое дело, что если вы используете exec, обратите внимание, что это вызывается в регулярном выражении, тогда если вы использовали переменную для регулярного выражения, у вас есть больше возможностей
Вы не получите совпадений, если не используете переменную для регулярного выражения, поэтому используйте переменную для регулярного выражения при использовании exec
А с помощью exec вы можете получить "индекс" совпадения
Поэтому, если вам нужны индексы или захват, используйте exec (имейте в виду, что, как вы можете видеть, с "index", "index", который он дает, действительно n-е вхождение, он отсчитывается от 1. Так что вы можете получить правильный index путем вычитания 1. И, как вы можете видеть, он дает 0 - lastIndex из 0 - не найдено).
И если вы хотите растянуть совпадение, вы можете использовать его при захвате, но не когда регулярное выражение является глобальным, и когда вы делаете это для этого, тогда содержимое массива не все совпадения, а полное матч с последующими захватами.
источник
r.lastIndex
является ключевым фактором для понимания разницы междуexec
иmatch
.If your regex is global, and you are capturing, then you must use exec. Match won't return all your captures.
Получил на приставке. Просто скопируйте / вставьте"a,b,c,aa,bb,cc".match(/(\w+)/g);
Opera, Firefox."a,b,c,aa,bb,cc".match(/(\w+)/g)
что там происходит, он показывает все совпадения, и так уж получилось, что вы захватили каждое совпадение, поэтому если бы он показал все захваченные изображения, он бы выглядел точно так же (cntd).Match () функция
str.match(regexp)
будет делать следующее:g
флаг будет использоваться в регулярном выражении: он будет возвращать все подстроки (игнорируя группу захвата)g
флаг не используется в регулярном выражении: он вернет то же самое, что иregexp.exec(str)
null
Примеры .match () с использованием
g
флага:А .match () без
g
флага эквивалентен .exec () :.Exec () функция
regexp.exec(str)
будет делать следующее:g
флаг будет использоваться в регулярном выражении: он будет возвращать (за каждый раз , когда она называется) :[N_MatchedStr, N_Captured1, N_Captured2, ...]
из следующегоN
матч. Важный: он не перейдет к следующему совпадению, если объект регулярного выражения не сохранен в переменной (это должен быть тот же объект)g
флаг не используется в регулярном выражении: он вернет так же, как если бы у него былg
флаг и был вызван в первый раз и только один раз.null
Пример .exec () (сохраненное регулярное выражение + с использованием
g
флага = он изменяется с каждым вызовом):Примеры использования .exec (), когда он не меняется при каждом вызове:
источник
Иногда regex.exec () занимает много времени больше времени, чем string.match ().
Стоит отметить, что если результат string.match () и regex.exec () одинаков (например, когда не используется флаг \ g), regex.exec () займет где-то от x2 до x30, а затем string. соответствие():
Следовательно, в таких случаях подход «new RegExp (). Exec ()» следует использовать только тогда, когда вам нужно глобальное регулярное выражение (т.е. выполнить более одного раза).
источник