Regex или макска для номера

  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time

Serjao

Юзер

Serjao

Юзер
7 Ноя 2020
21
12
Всем привет.... Я сам не программист, но столкнулся с такой проблемой парсинга телефонов с сети!
И нужно правильно ввести Regex на мобильные телефоны.... Кто шарит помогите пожалуйста!!!
Нужно на UA номера.... Заранее спасибо !
 

AnGel

Администратор
Команда форума

AnGel

Администратор
Команда форума
27 Авг 2015
3,410
2,024
Примеры номеров покажите
 

Serjao

Юзер

Serjao

Юзер
7 Ноя 2020
21
12
Хотя бы такие...
0#########
0##-###-##-##
0##-##-##-###
0##-#-###-###
0(##)#######
0(##)-###-##-##
0(##)-##-##-###
0(##)-#-###-###
38(0##)#######
38(0##)#######
38(0##)-###-##-##
38(0##)-###-##-##
38(0##)-##-##-###
38(0##)-##-##-###
380#########
380##-###-##-##
380##-##-##-###
380-###-##-##-##
380-##-###-##-##
380-##-##-##-###
380(##)#######
380(##)-###-##-##
380(##)-##-##-###
380(##)-#-###-###
380-(##)-###-##-##
380-(##)-##-###-##
380-(##)-##-##-###
 

AnGel

Администратор
Команда форума

AnGel

Администратор
Команда форума
27 Авг 2015
3,410
2,024
Возьмем частный пример: 380-(##)-###-##-##, назначим цифры: 380-(08)-585-07-33 (номер ничей, просто рандром красивый).

К данному номеру подойдет еще частный случай записанный следующим видом: 380-08-585-07-33. Теперь мы сравним их столбиком:
380-(08)-585-07-33
380-08-585-07-33

Различие у нас лишь в скобках, но даже если будет иначе, случаи типа:
380#########
380##-###-##-##
380##-##-##-###
, то нужно будет переписать условие на более усложненное.


Теперь небольшой ликбез по основам регуляных выражений:
[] - массив из выражений
[abc] - массив из a, b, c, но только 1 символ может быть выбран из данного множества
[^abc] - любой массив, который в себя не включает a, b, c. Также выборка лишь 1 символа из множества, далее не буду это повторять
[a-z] - любой символ из массива символов от a до z нижнего регистра
[^a-z] - любой символ, который не входит в данный диапазон значений, например [A-Z]
[A-z] либо [a-zA-Z] - любые символы верхнего и нижнего регистра. Обратите внимание, некоторые библиотеки не понимают [A-z], это редко, но встречается
[^A-z] - по аналогии - исключение данного массива из поиска
. - любой символ, вообще любой.
\s - любой символ пробела, табуляции или переноса строки
\S - отрицание предыдущего пункта (^ - не является постоянным отрицанием). Любой символ кроме пробела, табуляции или переноса строки
\d - любое число
\D - любой символ кроме числа
\w - соответствует всему, что входит в данный массив
(a|b) - условие при котором выбор идет между a и b
\a? - соответствует либо одному символу `a`, либо ничему (NULL)
\a* - соответствует нулю или большей последовательности из символов `a`
\a+ - соответствует одному (в предыдущем варианте вернуло бы NULL) или большей последовательности из символов `a`
{1} или {1, 3} или a{2,} тут чуть подробнее: в первом случае выборка будет из 1 элемента массива, во втором от 1 до 3, а в последнем от 2х до бесконечности. Последний вариант не рекомендуется у использованию новичками, так как в некоторых случаях это может привести к рекурсии или крашу некоторых библиотек. С данными случаями лично я не сталкивался, но в команде были проблемы. Теперь данные фигурные скобки можно прилеплять почти к чему угодно, например:

[A-z0-9\.\-\_]{1,25} - выборка от 1 до 25 символов A-z от 0 до 9 с включенными символами `.`, `-`, '_'.
\d{1,3} - выборка от 1 до 3 символов любых цифр от 0 до 9
\a{1,3} - выборка от 1 до 3 символов использования `a`
И так далее. На каждый чих и пук я не буду расписывать, комбинируйте и изучайте самостоятельно.

^ - соответствует началу строки без использования каких-либо символов. Если используется многострочный режим, то он также будет совпадать сразу после символа новой строки.
$ - Соответствует концу строки, не потребляя никаких символов. Если используется многострочный режим, то он также будет совпадать непосредственно перед символом новой строки.

Если мы вернемся выше к \a?, \a*, \a+, то у вас может сложиться впечатление, что нужно все писать так. На самом деле нет. Если вы напишете \$ - вы будете искать символ $ в подстроке, а не использовать его логическое значение поиска первого выражения (слова) во всем тексте.
Возможно, я что-то упустил в данном мануале, можете добавлять, я обновлю.

Теперь вернемся к нашим баранам, т.е. самой задачи: написать регулярное выражение, которое удовлетворяло бы всем условиям. Тут решений как минимум 3:
1. Самое тупое и простое: написать на каждый случай регулярное выражение и перебирать значения до победного.
2. Сложность средняя: написать регулярное выражение, которое покроет больше половины задачи - я данный вариант и выбрал, так как долго расписывал мануал выше. Далее пишем еще одно, которое покрывает оставшуюся часть.
3. Сложная: написать одно регулярное выражение, которое покроет задачу полностью.

Мы будем пользоваться следующими сервисами:
В каждом их них есть полноценная справка, прошу прочесть для ознакомления. Там может быть та информация, которая не была озвучена тут.
Я использую первый, так как очень удобно смотреть в реалтайме на то, как я дописываю регулярку и соответствует ли она выражению или нет.
1605044281916.png

И тесты во втором сервисе с разным массивом данных
1605044328510.png

Показал куда ткнуть, так как некоторые индивиды даже в 30 лет не видят этого.

Ну и само регулярное выражение будет выглядеть так: \d{1,3}(\-|\-\()\d{2,3}(\-|\)\-)\d{1,3}\-\d{1,3}\-\d{1,3}
 
  • Лайк
Reactions: Serjao

Serjao

Юзер

Serjao

Юзер
7 Ноя 2020
21
12
[+]?[3]?[8]?(\(|\)|\-|\ )*[0]?(\(|\)|\-|\ )*([3](\(|\)|\-|\ )*[9]|[6](\(|\)|\-|\ )*[7]|[6](\(|\)|\-|\ )*[8]|[9](\(|\)|\-|\ )*[6]|[6](\(|\)|\-|\ )*[8]|[9](\(|\)|\-|\ )*[7]|[9](\(|\)|\-|\ )*[8]|[5](\(|\)|\-|\ )*[0]|[6](\(|\)|\-|\ )*[6]|[9](\(|\)|\-|\ )*[5]|[9](\(|\)|\-|\ )*[9]|[6](\(|\)|\-|\ )*[3]|[9](\(|\)|\-|\ )*[3]|[9](\(|\)|\-|\ )*[1]|[9](\(|\)|\-|\ )*[2]|[9](\(|\)|\-|\ )*[4])(\(|\)|\-|\ )*\d{1,1}(\(|\)|\-|\ )*\d{1,1}(\(|\)|\-|\ )*\d{1,1}(\(|\)|\-|\ )*\d{1,1}(\(|\)|\-|\ )*\d{1,1}(\(|\)|\-|\ )*\d{1,1}(\(|\)|\-|\ )*\d{1,1}
Вот как-то такое можно скоротить ?
 

AnGel

Администратор
Команда форума

AnGel

Администратор
Команда форума
27 Авг 2015
3,410
2,024
Хотя бы проверяйте, что делаете:

1605402900407.png

У вас нет совпадений никаких и читать ее что-то не хочу. Вам назад к прочтению мануала нужно вернуться и посмотреть на то, что сделал я, а потом понять, почему начало у меня такое, а у вас херня какая-то.
 

Serjao

Юзер

Serjao

Юзер
7 Ноя 2020
21
12
([+]*[3]*[8]*)(\(|\)|\-|\ )*[0](\(|\)|\-|\ )*([6](\(|\)|\-|\ )*[7]|[6](\(|\)|\-|\ )*[8]|[9](\(|\)|\-|\ )*[6]|[6](\(|\)|\-|\ )*[8]|[9](\(|\)|\-|\ )*[7]|[9](\(|\)|\-|\ )*[8]|[5](\(|\)|\-|\ )*[0]|[6](\(|\)|\-|\ )*[6]|[9](\(|\)|\-|\ )*[5]|[9](\(|\)|\-|\ )*[9]|[6](\(|\)|\-|\ )*[3]|[9](\(|\)|\-|\ )*[3])(\(|\)|\-|\ )*\d{1,1}(\(|\)|\-|\ )*\d{1,1}(\(|\)|\-|\ )*\d{1,1}(\(|\)|\-|\ )*\d{1,1}(\(|\)|\-|\ )*\d{1,1}(\(|\)|\-|\ )*\d{1,1}(\(|\)|\-|\ )*\d{1,1}​
Тут есть совпадение только на начало номера "067" "096" "068" и т.д.
 

AnGel

Администратор
Команда форума

AnGel

Администратор
Команда форума
27 Авг 2015
3,410
2,024
Изучайте дальше регулярные выражения, вы игнорируете то, что я написал выше.
 

О нас

  • Наше сообщество существует уже много лет и гордится тем, что предлагает непредвзятое, критическое обсуждение различных тем среди людей разных слоев общества. Мы работаем каждый день, чтобы убедиться, что наше сообщество является одним из лучших.

    Dark-Time 2015 - 2022

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя