Tag: Регулярные выражения

V8 & unicode RegExp-ы

Не так давно в V8 движок добавили поддержку флага /u (т.е. поддержку unicode) для регулярных выражений. В nodeJS можно подключить флагом –harmony_unicode_regexps. Вот небольшой обзор по новым возможностям. При установленном флаге . понимает иероглифы, их же стало можно использовать в описании регулярного выражения без экранирования, появилась поддержка i флага.

Но! Они недобавили самого вкусного ― \p{L}. При помощи модификатора \p можно кратко описать многие вещи (см. раздел Unicode Categories). К примеру можно описать в пару символом регулярку, которая будет проверять принадлежность символа к алфавиту какого-либо языка. Например, /^\p{L}[\p{L}\d-_ ]+$/u отлично подойдёт для валидации имени пользователя, не поставив в незавидное положение ни грузин, ни китайцев, ни русских. Но отлично отфильтрует рандомный бред с клавиатуры.

Надеюсь, что это временно. А пока можно воспользоваться, к примеру, XRegExp-ом.

String.split и RegExp

При написании тестов столкнулся с интересной проблемой. Метод String.split работал не так, как я от него ожидал. Я долго возился с различными вариантами жадного и ленивого поиска, пока наконец не понял, что дело не в них. Перейду сразу к сути:

'aaaa'.split(/a+/); // ["", ""]
'aaaa'.split(/(a+)/); // ["", "aaaa", ""] WAT?
'aaaa'.split(/(?:a+)/); // ["", ""]

Полез в дебри документации:

Если разделитель является регулярным выражением, содержащим подгруппы, то каждый раз при сопоставлении с разделителем, результаты (включая те, что не определены) захвата подгруппы будут помещаться внутрь выходного массива. Однако, не все браузеры поддерживают эту возможность.

Всё просто. Если знаешь. 

Регулярное выражение для никнейма

Сия заметка о том, как написать регулярное выражение для проверки валидности никнейма. На мой взгляд, валидным никнеймом является ник начинающийся с алфавитного символа, и содержащий только символы алфавита, цифры, символы - и _, и пробел.  Ник не должен быть короче 4 символов. Загвоздка заключается в том, что алфавит может быть любым - японский, китайский, кирилический, греческий…

Если написать просто \w, то мы ~ получим - A-Za-z0-9, что точно не соответствует задаче. Решение -  \p{L} . В php сработает с версии >= 5.1.0, причём, если верить этому источнику ,  pcre должен быть собран с опцией “–enable-unicode-properties”. Я использую php5.3 из коробки, у меня всё заработало :) Итак, регулярка получается следующей - #^\ p{L} [ \p{L} \d-_\ ]+$# u .