Комментарии 54
Читайте «Mozilla Developer Network», там обычно полная информация. Вот и в данном случае developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/test:
As with exec (or in combination with it), test called multiple times on the same global regular expression instance will advance past the previous match.
А зачем понадобилось вписвать сюда параметр /g?
Разве не логичнее было его не писать вообще?
Разве не логичнее было его не писать вообще?
Если продолжить эту мысль, то вместо
/([0-9])+/g
можно записать сперва/([0-9])+/
а затем/([0-9])/
и наконец/[0-9]/
Также скобки в начальном выражении совершенно не нужны, первое упрощение могло выглядеть как /[0-9]+/.
/\d+/ ;)
Там и "+" не нужен. В условии ведь было «хотя бы одна цифра». Значит, после нахождения первой цифры можно остановиться и вернуть true.
А если ещё убрать объявление регулярки перед функцией:
то автор вообще не столкнулся бы с проблемой :)
function has_digit(s) { return /\d/.test(s); }
то автор вообще не столкнулся бы с проблемой :)
автор хотел показать пример с кэшированием регулярки, чтобы при каждом вызове не происходил повторный парсинг и создание объекта RegExp
Кое-где — столкнулся бы.
Очевидная вещь же. Если вы этого не знали, значит это лишь ваша оплошность и нехватка опыта. Таких вещей бесчисленное множество, зачем о каждой писать на Хабре? =)
А теперь запускаем код в FF 3.6 или любом достаточно старом браузере и любуемся на результаты.
Автор так бежал, так спешил поделиться своей находкой, что до самой сути и не дошел. А если бы умел пользоваться поиском, нашел бы замечательную статью на javascript.ru.
javascript: function test(d){return /([0-9])+/g.test(d)}; alert( [test('5'), test('5')] )
Автор так бежал, так спешил поделиться своей находкой, что до самой сути и не дошел. А если бы умел пользоваться поиском, нашел бы замечательную статью на javascript.ru.
Статью дальше ката вообще читали? Или так спешили поделиться своей находкой, что не хватило времени?
Нет, что Вы! Мне
с неба свалилось./([0-9])+/g.test("abc")
Этот код не вызывает проблем.
Зря умничаете. Отличие вашего кода и того кода, что привёл автор в том, что у вас при каждом тесте создаётся новое регулярное выражение, а у автора — используется одно и то же. Попробуйте что-то типа такого:
javascript: function test(d){return test.regexp.test(d)}; test.regexp = /([0-9])+/g; alert( [test('5'), test('5')] )
Эх, TheShock, а я считал Вас разбирающимся в JS…
Почитали бы хотя бы статью по ссылке
Почитали бы хотя бы статью по ссылке
То есть, простыми словами, литеральный регэксп не создается каждый раз при вызове var r = /regexp/.Это баг спецификации ES3, и в ES5 он уже исправлен (соответственно, и некоторые браузеры подтянулись).
Вместо этого браузер возвращает уже существующий объект, со всеми свойствами, оставшимися от предыдущего запуска.
Firefox 3.6.16 true, false.
Что я делаю не так?
Комментатор так бежал, так спешил поделиться своей находкой, что даже запустить свой код не удосужился?
Что я делаю не так?
Комментатор так бежал, так спешил поделиться своей находкой, что даже запустить свой код не удосужился?
*facepalm*
Вы на код посмотрели перед запуском? Автор утверждает, что код
> /([0-9])+/g.test(«abc»)
Не вызывает проблем. Внимание, вопрос: чем таким '5' во втором вызове отличается от '5' в первом, что второй вызов вернет отличный от первого результат?
Вы на код посмотрели перед запуском? Автор утверждает, что код
> /([0-9])+/g.test(«abc»)
Не вызывает проблем. Внимание, вопрос: чем таким '5' во втором вызове отличается от '5' в первом, что второй вызов вернет отличный от первого результат?
Довольно интересно. Google Chrome (10.0.648.6 dev): true, true
Эта статья демонстрирует полное незнание регулярных выражений. Зачем этой проверке флаг g? Зачем скобки вокруг символьного класса?
Забавный факт. Не обращал на него внимания.
На ActionScript, который основан на том же стандарте, что и JavaScript, данное поведение повторяется.
На ActionScript, который основан на том же стандарте, что и JavaScript, данное поведение повторяется.
Как раз недавно писал по этому поводу: habrahabr.ru/blogs/javascript/112518/#comment_3613835
Автору: текст немного сумбурен.
Автору: текст немного сумбурен.
Сколько пафоса в статье, а толком объяснить так и не смог. Столько всякой воды вокруг одной строки с ответом, что хрен найдешь ее там.
эээ, я вот одного не пойму — сделав банальную ошибку с инициализацией, зачем обвинять в этом хорошие ресурсы и документацию?
Спасибо за эту статью, но если внимательно читать книги, вот например у Флэнегана написано «Когда exec() вызывается для регулярного выражения, содержащего флаг g, метод устанавливает свойство lastIndex объекта регулярного выражения равным номеру позиции символа, следующего непосредственно за найденной подстрокой. Когда метод exec() вызывается для того же регулярного выражения второй раз, он начинает поиск с символа, позиция которого указана в свойстве lastIndex.»
Читайте книги внимательно, и не будет таких вот трудновылавливаемых ошибок
Читайте книги внимательно, и не будет таких вот трудновылавливаемых ошибок
Ресурсы все правильно пишут, единственно что про lastIndex умалчивают. Кстати, автор javascript.ru абсолютно в курсе этого поведения, в частности на мастер-классах про это рассказывает.
Вы такими темпами JavaScript изучите :)
Да, интересное исследование, сам натыкался на такой «финт», просто не думал, что можно из этого написать заметку на Хабре :)
>Удивляет, что большинство сетевых ресурсов по JavaScript оказались бесполезны.
2006 год — обсуждалось на Винграде
2007 год — обсуждалось на ДКлабе
Обсуждалось и задолго раньше, ссылок из глубокого прошлого под рукой нет, поверьте на слово. И конечно же это поведение описано и на более молодых ресурсах, и в ньюсах англоязычных, и в книгах (того же Флэнагана), и в спеках языка, и в самой экме… Но вдумчиво не читали, не читаем и не будем читать. Всё как всегда — ни дня без чудесного открытия… ;-)
2006 год — обсуждалось на Винграде
2007 год — обсуждалось на ДКлабе
Обсуждалось и задолго раньше, ссылок из глубокого прошлого под рукой нет, поверьте на слово. И конечно же это поведение описано и на более молодых ресурсах, и в ньюсах англоязычных, и в книгах (того же Флэнагана), и в спеках языка, и в самой экме… Но вдумчиво не читали, не читаем и не будем читать. Всё как всегда — ни дня без чудесного открытия… ;-)
… мы хотим проверить регулярным выражением, что в строке есть хотя бы одна цифра ...
/\d/.test(str);
Ну вот так как-то.
а я вот так делаю:
function has_digit(s) { return (s.search(digits) != -1) }
function has_digit(s) { return (s.search(digits) != -1) }
bool b;
…
if (Convert.ToString(b).Length == 4) //True
{
…
}
else
…
if (Convert.ToString(b).Length == 4) //True
{
…
}
else
Очередной пост на главной про изучение студентом регулярных выражений
Блин… прочитал почти все комментарии и вообще запутался что верно, а что нет
Как уже писали выше: javascript.ru/tutorial/regexp-specials#staticheskie-svoystva
Какие регулярки? Автор, учи русский.
«Вам очевидно — почему?» :)
«Вам очевидно — почему?» :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Регулярная ловушка