Firefox 3.6.20 регулярное выражение дает противоречивые результаты - PullRequest
2 голосов
/ 24 августа 2011

Я какое-то время отлаживал это приложение, и это привело меня к этому тесту. Когда я запускаю его в Firefox 3.6.x, он работает только в 50% случаев.

var success = 0;

var pat = /(\d{2})\/(\d{2})\/(\d{4})\s(\d{2}):(\d{2})\s(am|pm)/g;
var date = "08/01/2011 12:00 am";

for(var i=0;i<100;i++) if(pat.exec(date)) success++;
alert("success: " + success + " failed: " + (100 - success));

это оповещения success: 50 failed: 50

что здесь происходит?

Ответы [ 2 ]

4 голосов
/ 24 августа 2011

Флаг g означает, что после первого совпадения второй поиск начинается в конце соответствующей подстроки (т. Е. В конце строки) и завершается неудачно, возвращая начальную позицию в начало строка.

Если ваше регулярное выражение использует флаг "g", вы можете использовать метод exec несколько раз, чтобы найти последовательные совпадения в одной и той же строке. При этом поиск начинается с подстроки str, указанной в свойстве lastIndex регулярного выражения (test также будет продвигать свойство lastIndex).

из документов MDC для RexExp.exec () . (См. Также RegExp.lastIndex )

2 голосов
/ 24 августа 2011

Вы используете глобальный флаг.В результате регулярное выражение совпадает только с определенным индексом.После каждого матча pat.lastIndex == 19, затем pat.lastIndex == 0 и т. Д.

Более простой пример:

var r = /\d/g;
r.exec("123"); // 1 - lastIndex == 0, so matching from index 0 and on
r.exec("123"); // 2 - lastIndex == 1, ditto with 1
r.exec("123"); // 3 - lastIndex == 2, ditto with 2
r.exec("123"); // null - lastIndex == 3, no matches, lastIndex is getting reset
r.exec("123"); // 1 - start all over again
...