LINUX.ORG.RU

подскажите с регуляркой.


0

2

привет.

нужна регулярка для валидации ников по следующим условиям: ник может содержать символы латинского алфавита в верхнем/нижнем регистрах и любой из трех '.-_' (точка, тире, подчерк). начинаться ник должен либо с символов, либо с цифр. символы '.-_' нельзя использовать подряд, они должны разделяться либо буквами алфавита, либо цифрами. длина логина должна находится в диапазоне 3-30 символов.

нагуглил/дорукоблудил такое: /^[a-z0-9][-a-z0-9\._]{3,30}$/i

но вот как сделать запрет на использование подряд любых из '.-_' - не знаю. и нагуглить не получается.

благодарен.

★★★

длина логина должна находится в диапазоне 3-30 символов

Я смотрю, тут дискриминация по длине логина? Или короткие логины будут привелегированными? Трёхзнаки, двузнаки, эх...

d ★★★★
()

матчингом второй регулярки

/[-_]{2}/

Deleted
()
rain@elitebook:~$ echo -n aaaa-bla.la_a-a-aa-aaaaa  | grep -E '^([a-zA-Z0-9][\._\-]?){1,30}$'
aaaa-bla.la_a-a-aa-aaaaa
rain@elitebook:~$ echo -n aaaa-bla.la_a-a-aa-_aaaaa  | grep -E '^([a-zA-Z0-9][\._\-]?){1,30}$'
rain@elitebook:~$ echo -n blabla | grep -E '^([a-zA-Z0-9][\._\-]?){1,30}$'
blabla
YAR ★★★★★
()

За исключением длины вроде матчит:

^([a-z0-9]+[-\.\_]?)+$
Может проверку на длину строки через strlen-образное реализовать?

timon-ltv
()

Во-первых, у тебя неправильная регулярка: она запрещает ники с большой буквы, а длину устанавливает в диапазоне от 4 до 31 символа.

Тебе нужны два регвыра, как выше уже советовали, но лучше написать простенький парсер.

Apple-ch ★★
()
Ответ на: комментарий от niXman

Не думаю, что твоя задача решаема без человека. Под твои запросы любая, возможно укороченная, хэш сумма подходит.

d ★★★★
()

Не забывайте уточнять где будет использоваться регулярка. Ибо в луа, например, они очень ограничены (ну «по умолчанию»). В других же языках (perl) можно протрезветь/поднапрятьчся и сделать всё вами указанное.

И почему не в Development?

anonymous
()
Ответ на: комментарий от Apple-ch

лучше написать простенький парсер

Лорчую, а лучше найти либу и задать ей грамматику, а она сделает ОПу пасрер. Кстати есть ли преобразователи L-грамматика -> регулярка? Надо будет посмотреть.

anonymous
()
Ответ на: комментарий от anonymous

найти либу и задать ей грамматику, а она сделает ОПу пасрер. Кстати есть ли преобразователи L-грамматика -> регулярка?

Подскажи пожалуйста подробнее, что за «L-грамматика»?

anonymous
()
Ответ на: комментарий от niXman

Если нет технических ограничений, придумывать новые не нужно.

Kalashnikov ★★★
()
Ответ на: комментарий от anonymous

Немного погуглил, как понял, в общем случае - нет.
http://en.wikipedia.org/wiki/Chomsky_hierarchy
http://nikic.github.com/2012/06/15/The-true-power-of-regular-expressions.html

/-------------------------------------------\
|                                           |
|     Recursively enumerable languages      | Type 0
|                                           |
|   /-----------------------------------\   |
|   |                                   |   |
|   |    Context-sensitive languages    |   | Type 1
|   |                                   |   |
|   |   /---------------------------\   |   |
|   |   |                           |   |   |
|   |   |  Context-free languages   |   |   | Type 2
|   |   |                           |   |   |
|   |   |   /-------------------\   |   |   |
|   |   |   | Regular languages |   |   |   | Type 3
|   |   |   \-------------------/   |   |   |
|   |   \---------------------------/   |   |
|   \-----------------------------------/   |
\-------------------------------------------/

anonymous
()
Ответ на: комментарий от YAR

допили еще чтоб запрещала использовать не алфанумереки в качестве последнего символа.

/^([a-z0-9][\._\-]?[a-z0-9]){1,30}$/i

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

Одним выражением - пока хз. Сделай вторую проверку да и все.

YAR ★★★★★
()

Perl:

/^([a-z0-9]_?[a-z0-9]?)+[^_]$/i

А потом проверить на длинну.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 2)
Ответ на: комментарий от YAR

Там небольшой просчёт :)

{ echo -n '1_' ; for i in {3..31} ; do echo -n 1 ; done } | grep -E '^([a-zA-Z0-9][\._\-]?){1,30}$'
1_11111111111111111111111111111
{ echo -n '1_' ; for i in {3..31} ; do echo -n 1 ; done } | wc -c
31
KennyMinigun ★★★★★
()
Ответ на: комментарий от YAR

да, спасибо большое. вопрос закрыт.

niXman ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.