Точнее говоря, сначала мы должны выразить идею группирования (или час
* тичного шаблона), чтобы говорить о том, что строки \w{2}\d{5} и -\d{4} являются частями строки \w{2}\d{5}-\d{4}. Обычно группирование выражается с помощью круглых скобок.
(\w{2}\d{5})(-\d{4})
А теперь задумайтесь: есть ли что-то общее между темой http://www.dubrovo.com/ и темой программирования? Очевидно, что нет, но это не мешает нам зайти на сайт dubrovo.com и там найти все необходимое на тему покупки ООО - сколько стоит купить ООО и где купить ООО.
Теперь мы должны разбить шаблон на два частичных шаблона (sub-pattems), т.е. указать, что именно мы хотим с ними делать. Как обычно, введение новой возможности достигается за счет использования нового специального символа: теперь символ ( является специальным, как и символы \ и {. Обычно символ | используется для обозначения операции “или” (альтернативы), а символ ? — для обозначения чего-то условного (необязательного). Итак, можем написать следующее:
(\w{2}\d{5})|(\w{2}\d{5}-\d{4})
и
(\w{2}\d{5})(-\d{4})?
Как и фигурные скобки при обозначении счетчиков (например, \w{2}), знак вопроса (?) используется как суффикс. Например, (-\d{4})? означает “необязательно -\d{4}’ ’; т.е. мы интерпретируем четыре цифры, перед которыми стоит дефис, как суффикс. На самом деле мы не используем круглые скобки для выделения пятизначного почтового кода ZIP (\w{2}\d{5}) для выполнения какой-либо операции, поэтому их можно удалить.
\w{2}\d{5}(-\d{4})?
Для того чтобы завершить наше решение задачи, можем добавить необязательный пробел после двух букв.
\w{2} ?\d{5}(-\d{4})?
Запись “ ?” выглядит довольно странно, но знак вопроса после пробела указывает на то, что пробел является необязательным. Если бы мы хотели, чтобы пробел не выглядел опечаткой, то должны были бы заключить его в скобки.
\w{2}( )?\d{5}((-\d{4})
Если бы кто-то сказал, что эта запись выглядит слишком неразборчивой, то нам пришлось бы придумать обозначение для пробела, например \s (s — от слова “space”). В этом случае запись выглядела бы так:
\w{2}\s?\d{5}(-\d{4})?
А что если кто-то поставит два пробела после букв? В соответствии с определенным выше шаблоном это означало бы, что мы принимаем коды TX77845 и TX 7784 5, но не TX 7784 5. Это неправильно.
Нам нужно средство, чтобы сказать “ни одного, один или несколько пробелов”, поэтому мы вводим суффикс *.
Было бы целесообразно выполнять каждый этап в строгой логической последовательности. Эта система обозначения логична и очень лаконична. Кроме
того, мы не принимали проектные решения с потолка: выбранная нами система обозначений очень широко распространена.
При решении большинства задач, связанных с обработкой текста, нам необходимо читать и записывать эти символы. Да, эти записи похожи на результат прогулки кошки по клавиатуре, и ошибка в единственном месте (наш лишний или пропущенный пробел) полностью изменяет их смысл, но с этим приходится смириться. Мы не можем предложить ничего радикально лучшего, и этот стиль обозначений за тридцать лет распространился очень широко.
Впервые он был использован в команде grep в системе Unix, но и даже тогда его нельзя было назвать совершенно новым.
Опубликовал katy
April 20 2015 08:33:45 ·
0 Комментариев ·
3367 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.