Для выполнения этого упражнения будет использован файл Trinkets2 . txt, содер¬жащий следующий текст:
Этого брелка вам хватит надолго.
Некоторые жить не могут без брелка. А некоторые - без брелока. Такие брелки могут существенно облегчить жизнь деловому человеку. Этим брелокам не откажешь в стильности. Красный брелок - для энергичных.
Для демонстрации работы регулярного выражения выполните следующие шаги.
1. Откройте OpenOffice.org Writer, и откройте в нем файл Trinkets2. txt.
2. Нажмите комбинацию клавиш , чтобы открыть диалоговое окно Найти и заменить.
3. Установите флажки Регулярное выражение и Учитывать регистр.
4. Введите в текстовом поле Найти шаблон брело?ки?а?м? и щелкните на кнопке Найти все. Если все нормально, то должны быть выделены слова, показанные на рис. А. 16.
Как видите, обнаружены все интересующие нас формы слова.
А сейчас разберемся, как выполняется сравнение с формами слова брелок.
Как шаблон брело?ки?а?м? сопоставляется со словом брелка? Предположим, что механизм обработки регулярных выражений находится в позиции перед первой бук¬вой слова брелка. В начале он проверяет наличие буквы б, т.к. должна присутствовать строчная буква б. Соответствие обнаружено. Затем проверяется наличие последую¬щих букв р, е и л. Они также обнаружены.
Затем выполняется сравнение с необязательной буквой о. Другими словами, нужно ноль или одно вхождение строчной буквы о. Т.к. обнаружено ноль экземпляров буквы о, совпадение обнаружено. Затем выполняется сравнение со строчной буквой к — есть такая буква в этом слове! После этого выполняется сравнение с необязательной бук¬вой и. Т.к. ее нет, то соответствие обнаружено. После этого механизм обработки ре¬гулярных выражений выполняется сравнение с необязательной буквой а — т.е. прове¬ряет наличие нуля или одного экземпляра буквы а. Поскольку эта буква имеется, то соответствие опять обнаружено. Наконец, выполняется сравнение с необязательной буквой м. И раз уж ее нет, то обнаружено последнее соответствие. Поскольку обна¬ружено соответствие для всех компонентов регулярного выражения, то обнаружено соответствие и для всего шаблона брело?ки?а?м?.
А как шаблон брело?ки?а?м? соответствует слову брелок? Предположим, что ме¬ханизм обработки регулярных выражений находится в позиции перед первой буквой слова брелок. В начале он сравнивает эту первую букву с буквой б, так как должно быть совпадение со строчной буквой б — оно есть. Затем проверяется наличие букв р, е, и еще одной буквы л. Они тоже присутствуют. Затем выполняется сравнение с необязательной буквой о. Другими словами, нужно, чтобы была ноль или одна строч¬ная буква о. Поскольку в слове имеется буква о, то обнаружено соответствие. Далее выполняется сравнение с буквой к. Она также имеется в этом слове. После этого меха¬низм выполняется сравнение с необязательной буквой и. Т.к. ее нет, соответствие об¬наружено. Затем механизм обработки регулярных выражений выполняет сравнение с необязательной буквой а — другими словами, проверяет, имеется ли ноль или один экземпляр буквы а. Поскольку этой буквы нет, соответствие обнаружено. И, наконец, выполняется сравнение с необязательной буквой м. Т.к. она не обнаружена, отмеча¬ется соответствие. Обнаружено соответствие всех компонентов регулярного выраже¬ния — следовательно, имеется соответствие шаблону брело?ки?а?м?.
Проработайте таким же образом другие приведенные выше шесть форм слов, и вы увидите, что любая из этих форм соответствует указанному регулярному выражению.
Шаблон,брело?ки?а?м? соответствует всем перечисленным семи формам слова, а вот соответствует ли этот шаблон следующей последовательности символов?
брелокиам
Вы видите, что оно также соответствует шаблону? А видите, почему? Если при¬сутствуют все три необязательных символа, указанных в регулярном выражении, то вышеприведенная последовательность символов также соответствует шаблону. Такая необычная последовательность символов вряд ли встретится в реальном документе, Поэтому вероятность ложного обнаружения не должна быть для вас проблемой.
И все-таки — как можно избежать проблемы, связанной с такой ненормальной по¬следовательностью символов, как брелокиам? Нужно поставить эту задачу примерно так, как описано ниже.
Проверить наличие буквы б. Если она присутствует, проверить наличие буквы р. Если она присутствует, проверить наличие строчной буквы е. Если она присутствует, проверить наличие строчной буквы л. Если она присутствует, проверить наличие необязательной строчной буквы о. Если она присутствует, проверить наличие строчной буквы к. Если она присутствует, проверить наличие необязательной строчной буквы а. Теперь, если обнаруже¬но соответствие, проверить наличие необязательной строчной буквы м. При отсутствии первой необязательной буквы а проверить наличие необязательной буквы и.
Средства, с которыми вы пока знакомы, не позволяют выразить мысли вроде "про¬верить наличие чего-то, если не было чего-то другого". Такой подход может помочь достичь большей точности, но за счет увеличения сложности.
Сравнение с несколькими необязательными символами
Tagged: