Почему /^(.+)+Q$/.test("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")занимает так много времени?

Когда я запускаю

/^(.+)+Q$/.test("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")

в Chrome или IE, выполнение занимает ~10 секунд. (Firefox может оценить его почти мгновенно.)

Почему это занимает так много времени? (И почему/как Firefox может делать это так быстро?)

(Конечно, я бы никогда не запускал это конкретное регулярное выражение, но я столкнулся с аналогичной проблемой с регулярным выражением URL в http://daringfireball.net/2010/07/improved_regex_for_matching_urls, и, похоже, все сводится к этому, т.е. есть определенные URL-адреса, которые заставят браузер чтобы заблокировать)

Например:

var re = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i;
re.test("http://google.com/?q=(AAAAAAAAAAAAAAAAAAAAAAAAAAAAA")

11
задан David Ingersol 18 April 2012 в 21:47
поделиться