Сравнение с необязательными символами

Сравнение с литеральными символами выполняется элементарно, особенно если нужно найти в точности по одному символу, указанному в регулярном выражении. Следующим шагом от этой простейшей ситуации является одиночный литераль¬ный символ, который может встречаться ноль или один раз. Другими словами, это необязательный символ. В большинстве диалектов регулярных выражений имеется символ — вопросительный знак (?)— который означает, что предыдущий фрагмент Необязателен. Термин "фрагмент" обозначает то, что находится перед вопроситель¬ным знаком. Такой фрагмент может быть одиночным символом или различными бо¬лее сложными конструкциями регулярными выражений. Пока мы будем иметь дело с одиночными необязательными символами.
К примеру, предположим, что вам нужно работать со списком заголовков реклам¬ных текстов, в которых есть слово "брелок". В русском языке допустимо склонять это слово как с выпаданием, так и с сохранением гласной "о": "брелки" и "брелоки", "брел-ком" и "брелоком" и т.д. Шаблон, соответствующий обоим этим корням, выглядит так:
брело?
Теперь можно стандартизовать документы, чтобы они содержали американские варианты слов.
Сравнение с необязательными символами
Выполните в Komodo Regular Expression Toolkit следующие шаги.
1. Откройте Komodo Regular Expression Toolkit и сотрите старую информацию из полей ввода.
2. Введите в поле проверяемого текста слово брелок.
3. Введите в поле регулярного выражения шаблон брело?к. Как показано на рис, А. 14, текст брелок соответствует шаблону.
Протестируйте это регулярное выражение с текстом из пробного файла Trinkets. txt:
Удобный брелок-фонарик
Ну просто клевый брелоооок!
Яркие брелоки для детей
Яркие брелки для детей
Берлога просто, а не квартира...
Стильные флэш-брелки 1-8 ГБ
Слово брелок в строке Яркие брелки для детей также соответствует шаблону брело? к.
Когда механизм обработки регулярных выражений доходит до позиции перед бук¬вой б в слове брелок, он сравнивает символ с буквой б. Обнаруживается совпадение. Дальше осуществляется сравнение с буквой р — также успешно. Затем выполняются s сравнения с буквой е и с буквой л. И здесь совпадения. Затем выполняется сравне¬ние с образцом о?, который означает ноль или одну строчную букву о. Поскольку за буквой л находится ноль букв о, это также совпадение: шаблон о? соответствует нулю символов. И, наконец, выполняется сравнение с последней буквой шаблона, т.е. со строчной буквой к. Поскольку следующий символ в слове брелки совпадает со строч¬ной буквой к, то обнаружено соответствие всему шаблону.
Но в строке Ну просто клевый брелоооок! соответствие не обнаружено. Единствен¬но возможное соответствие могло быть найдено в последовательности символов брелоооок. Неудача возникает после сопоставления механизмом обработки регуляр¬ных выражений образца о?. Т.к. образец о? означает "совпадение с нулем или одной буквой о", то он соответствует первой букве о в слове брелоооок. После успешного сравнения механизм обработки регулярных выражений сравнивает последний символ шаблона брело?к со второй строчной буквой о из слова брелоооок. Это сравнение завершается неудачей, и поэтому неудачно заканчивается сравнение всего шаблона брело?к со словом брелоооок
Что произойдет, когда механизм обработки регулярных выражений будет сравни¬вать с шаблоном строку Яркие брелоки для детей?
Когда механизм обработки регулярных выражений доходит до позиции перед бук¬вой б в слове брелоки, он выполняет сравнение со строчной буквой б. Это сравнение заканчивается успешно. Затем он выполняет сравнения с буквой р, буквой е и еще одной буквой л. Они также совпадают. Затем выполняется сравнение с образцом о?, который означает ноль или одну букву о. Т.к. за буквой л находится одна строчная бу¬ква о, то и здесь обнаружено соответствие. И, наконец, механизм обработки регуляр¬ных выражений сравнивает последний символ шаблона — строчную букву к. Поскольку следующий символ в слове брелоки совпадает с буквой к, то обнаружено соответствие всему шаблону.
Проверить вхождение корней брелк и брелок можно и с помощью утилиты f indstr, хотя в ней нет метасимвола для обозначения необязательности символов. Во многих случаях успешно работает метасимвол *, который соответствует нулю, од¬ному или большему количеству вхождений предыдущего символа.
Чтобы найти с помощью утилиты f indstr строки, содержащие корни брелк и брелок, введите следующую команду:
f indstr /Ы брело*к Trinkets .'txt
В этой команде предполагается, что файл Trinkets.txt находится в текущем ка¬талоге.
На рис. А.15 показан результат обработки утилитой f indstr файла Trinkets. txt.
В строках, содержащих корни брелк и брелок, обнаружены совпадения, незави¬симого от того, являются ли они полными словами или частями более длинных слов. Однако обратите внимание, что найдено также и странное "слово" брелоооок, т.к. ме¬тасимвол * допускает несколько вхождений буквы о. В большинстве реальных случаев такие вычурные "слова" вряд ли встретятся, и при использовании утилиты findstr квантификатор * неплохо заменит квантификатор ?. Но в некоторых случаях, когда нужно найти вхождение в точности нуля или одного символа, возможностей утилиты findstr может не хватить, т.к. она обнаружит соответствия и с некоторыми непреду¬смотренными словами.
Теперь, научившись использовать в регулярных выражениях одиночные необяза¬тельные символы, рассмотрим, как применять в одном регулярном выражении не¬сколько необязательных символов.