Построение регулярных выражений

 
 
 
Сообщения:60
Попробуем построить регулярное выражение для проверки телефонов вида
+41 76 123 23 43
+41761232343
+41-76-123-23-43 


Для этого не обойтись без знания языка регулярных выражений, а иначе как вы собрались сделать это? Что, еще один язык?! И да, и нет. Можно воспользоваться сервисом построения регулярных выражений Visual Expressions, который позволяет в удобной и наглядной манере строить такие выражения. Выглядит это безобразие примерно так



На картинке видно из чего состоит это выражение и как оно строится. Лучший способ понять как оно работает - это построить самому регулярное выражение.

Проверим полученный результат:

public class Main {

	public static void main(String[] args) {
		
		String regexp = "(?:\\+)((?:\\d){2}(?:\\-)?(?:\\ )?){2}(?:\\d){3}(?:\\-)?(?:\\ )?([0-9]{2}(?:\\-)?(?:\\ )?){2}";
		
		String t1 = "+41 76 123 23 43";
		String t2 = "+41761232343";
		String t3 = "+41-76-123-23-43";
		String t4 = "+41762 32343" 

		System.out.println(t1.matches(regexp));
		System.out.println(t2.matches(regexp));
		System.out.println(t3.matches(regexp));
		System.out.println(t4.matches(regexp));

	}
}


Результат
true
true
true
false
Изменен:10 сен 2016 07:14
 
 
Сообщения:7989
Вы если написали некую крутую на ваш взгляд штуковину, можете в более повествовательном ключе о ней рассказать, вы ж не на хабре :)

Quote:
Можно воспользоваться сервисом построения регулярных выражений Visual Expressions

А как потом модифицировать получившиеся регэкспы?

Да и сложность обычно не в том чтобы составить, а в том чтобы проверить :)

Ваш пример сгенерированный честно говоря выглядит не ахти. Во-первых имхо часть групп (?:...) можно убрать, там где приоритет и без того правильно работает - уж очень они загромождают. Во-вторых:

Quote:
(?:\\-)?(?:\\ )?{3}

К чему у нас здесь тройка-то относится?

Quote:
([0-9]{2}

И как вышло что здесь вместо \\d цифры?

Да и пробел использовать не очень правильно в регэкспах :)

И честно говоря с первого взгляда выглядит так что разбираться в обсуждаемом сервисе не быстрее чем прочесть инструкцию по регэкспам. ;)

А что вы с Serializable коллеги или друзья?

www.codeabbey.com - programming problems for novice coders (+ certificates)
Изменен:15 авг 2015 09:30
 
 
Сообщения:60
RodionGork:
А как потом модифицировать получившиеся регэкспы?


если не закрывать окно, то "пока горячо" все можно модифицировать, а потом, если потребуется, не трудно и второй раз построить, тем боллее что уже опыт должен быть

RodionGork:
Да и сложность обычно не в том чтобы составить, а в том чтобы проверить :)


сервис по проверке регекспов я как-то встречал, да и не трудно это сделать, если потребуется

RodionGork:
Quote:
(?:\\-)?(?:\\ )?{3}
К чему у нас здесь тройка-то относится?

точно, это лишнее, спасибо )

RodionGork:
Quote:
([0-9]{2}
И как вышло что здесь вместо \\d цифры?

это просто показывает возможность по другому задать цифру

RodionGork:
Да и пробел использовать не очень правильно в регэкспах :)

наверное какая-то последовательность для пробела есть, я не парился, хотя там есть возможность задать пробел через символы

RodionGork:
И честно говоря с первого взгляда выглядит так что разбираться в обсуждаемом сервисе не быстрее чем прочесть инструкцию по регэкспам. ;)

ну прям там, для некоторых это может оказаться легче, чем "еще один язык" :)
 
 
Сообщения:7989
Quote:
если не закрывать окно, то "пока горячо" все можно модифицировать, а потом, если потребуется, не трудно и второй раз построить, тем боллее что уже опыт должен быть

Нет-нет, я наверное неправильно выразил мысль. Вот вам дают на поддержку приложение которое писал кто-то другой. Хм, ну например я. И в коде вы видите некий довольно противный регэксп. Особенно хорошо если с look-ahead-ами или behind-ами :)

И выясняется что проблема в этом регэкспе, какие-то моменты он не совсем так матчит как хотелось бы - нужно его менять.
Тут уместен был бы сервис который парсит регэксп вновь, позволяет его скорректировать и перегенерировать. Не знаю насколько яснее стало :)

Quote:
сервис по проверке регекспов я как-то встречал, да и не трудно это сделать, если потребуется

Тут я тоже явно плохо выразился. Проверить что данный конкретный регэксп так-то работает с заданным тесткейсом - это дело плевое конечно.

Но вот если мы возьмём ваш пример с телефонами - вы же перечислили не все возможные тесткейсы. Т.е. нам только для смоук-теста хорошо бы проверить что все допустимые кейсы проходят. А по хорошему нужно дальше проверять что недопустимые не проходят. Вот она где, могила-то :)

Ну или приходят к человеку и говорят "а напиши регэксп чтоб выдирал из текста (xml) заданный тег (по имени тега) - от начального до конечного. Тут придётся неслабо голову почесать прежде чем сообразишь какие собственно правила нужно описать...

Так что в целом задумка интересная - и воплощение любопытное - может вполне неплохо смотреться в вашем портфолио на гитхабе - но имхо прямо уж решить проблему освоения регэкспов так не получится, боюсь. :)

www.codeabbey.com - programming problems for novice coders (+ certificates)
 
 
Сообщения:60
Тем временем проект научился парсить свои же регулярки, что позволяет упростить изменение созданных ранее регекспов. Вроде мелочь, а вещь нужная :)
Изменен:05 авг 2016 09:13
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет