Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярные выражения работают через раз (https://javascript.ru/forum/misc/12178-regulyarnye-vyrazheniya-rabotayut-cherez-raz.html)

San4ezy 04.10.2010 22:19

Регулярные выражения работают через раз
 
Добрый вечер!
Возникла проблема:
Есть вот такой массив регулярок (проверяет ссылки на принадлежность к файлообменникам):
var pattern=[
/https{0,1}:\/\/(www.){0,1}rapidshare.com\/.*/gi ,
/https{0,1}:\/\/(www.){0,1}letitbit.net\/.*/gi
]

Выполняю один и тот же код в разной последовательности:

ab
var a="http://www.rapidshare.com/files/421054723/Avatar.2010.DVD5.part01.rar";
var b="http://www.rapidshare.com/files/421054763/Avatar.2010.DVD5.part02.rar";
if(pattern[0].test(a)){alert(a);}
if(pattern[0].test(b)){alert(b);}

Выводится только переменная a;

ba
var a="http://www.rapidshare.com/files/421054723/Avatar.2010.DVD5.part01.rar";
var b="http://www.rapidshare.com/files/421054763/Avatar.2010.DVD5.part02.rar";
if(pattern[0].test(b)){alert(b);}
if(pattern[0].test(a)){alert(a);}

Выводится только переменная b;

Хотя по логике должны выводиться обе переменные, только в разной последовательности.
Но выходит что регулярка работает при первой проверке, но не работает при второй. Более того, они работают при нечетных проверках, и не работают при четных (проверял практически)!
В чем проблема, чего я не понимаю? Помогите пожалуйста!!!
Спасибо!!!

Gvozd 04.10.2010 22:38

а что по вашему должен делать модификатор g?
раз уж используете его, то и почитали бы как именно он работает
http://javascript.ru/RegExp/lastIndex
http://javascript.ru/tutorial/regexp-specials#nayti-vse

San4ezy 04.10.2010 22:53

Да, убрал модификатор g и все заработало! Спасибо!

monolithed 04.10.2010 22:59

У вас во-первых в выражении указан протокол 'https', во-вторых, названия всех файлообменников как-правило уникальны и можно значительно сократить выражение...

Можно же все проще сделать:
var str = ['http://rapidshare.com', 'http://letitbit.net', 'http://ifolder.ru']
var reg = /rapidshare|letitbit|ifolder/;
for(i=0; i<str.length; i++){
    if(reg.test(str[i])){
         alert(str[i]);
    }
}

Ну а относительно вашего примера:
var pattern=[/rapidshare/]
var b="http://www.rapidshare.com/files/421054763/Avatar.2010.DVD5.part02.rar";
var a="http://www.rapidshare.com/files/421054723/Avatar.2010.DVD5.part01.rar";
if(pattern[0].test(a)){alert(a);}
if(pattern[0].test(b)){alert(b);}

San4ezy 04.10.2010 23:56

monolithed
В моем регулярном выражении
/https{0,1}:\/\/(www.){0,1}rapidshare.com\/.*/i

https{0,1} говорит о том, что http встречается обязательно, а s - 0 или 1 раз. То есть тут охвачен и http и https.
Действительно можно упростить регулярку, но на разных сайтах встречаются ссылки разного вида (с www и без), и к тому же могут встретиться ссылки, содержащие названия файлообменника, а вести на какой-то сайт.
Если честно, то начал с самого простого, а на этапе тестирования пришлось усложнить :)
Спасибо за участие в дискуссии

Aetae 05.10.2010 01:50

На последок вставлю свои пять копеек: вместо '{0,1}' юзайте '?' - кошернее.)


Часовой пояс GMT +3, время: 14:06.