Возьмем частный пример: 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. Сложная: написать одно регулярное выражение, которое покроет задачу полностью.
Мы будем пользоваться следующими сервисами:
В каждом их них есть полноценная справка, прошу прочесть для ознакомления. Там может быть та информация, которая не была озвучена тут.
Я использую первый, так как очень удобно смотреть в реалтайме на то, как я дописываю регулярку и соответствует ли она выражению или нет.
И тесты во втором сервисе с разным массивом данных
Показал куда ткнуть, так как некоторые индивиды даже в 30 лет не видят этого.
Ну и само регулярное выражение будет выглядеть так:
\d{1,3}(\-|\-\()\d{2,3}(\-|\)\-)\d{1,3}\-\d{1,3}\-\d{1,3}