tserbis:
Есть 2-е издание за 2003-й год.
Фридл
теперь рассмотрим применение выражения ^\\w+: к строке "Subject:". С первого взгляда можно сказать, что поиск завершится неудачей, потому что в тексте нет ни одного двоеточия, но механизм регулярных выражений придет к этому выводу лишь после полной проверки.
tserbis:
ondr, спасибо за помощь .
tserbis:
Просьба к модераторам: если можно,
смените название
52. страница 32
2 абзац снизу
фразу "выполняет привязку позиции к началу строки" заменить на "интерпретируется как обычный символ"
You might have noticed that the ^ used here is the same as the start-of-line caret
introduced on page 8. The character is the same, but the meaning is completely
different. Just as the English word .wind. can mean different things depending on
the context (sometimes a strong breeze, sometimes what you do to a clock), so
can a metacharacter. We\'ve already seen one example, the range-building dash. It
is valid only inside a character class (and at that, only when not .rst inside the
class). ^ is a line anchor outside a class, but a class metacharacter inside a class
(but, only when it is immediately after the class\'s opening bracket; otherwise, it\'s
not special inside a class). Don\'t fear . these are the most complex special cases;
others we\'ll see later aren\'t so bad.
Возможно, вы заметили, что для инвертирования классов используется тот
же символ ^, который отмечает начало строки. Символ действительно тот же,
но смысл у него совсем другой. Например, слово «крыша» в зависимости от
контекста может иметь совершенно разный смысл; то же самое можно сказать и
о метасимволах. Мы уже встречались с одним примером множественной интер-
претации — дефисом. Дефис интерпретируется как определитель интервалов
только в символьном классе (и то если он не находится в первой позиции).
Символ ^ за пределами символьного класса выполняет привязку позиции к началу
строки, внутри класса он является метасимволом класса — но лишь в том слу-
чае, если не следует сразу же после открывающей скобки (в противном случае
он интерпретируется как обычный символ). Не бойтесь, это самые сложные
примеры множественной интерпретации символов; в остальных случаях дело
обстоит проще.
Во 2-м издании?
Даже те метасимволы, которые мы рассмотрели, способны принести несомненную пользу, но настоящие возможности регулярных выражений начинаются с применения квантификаторов.
В отличие от других упоминавшихся метасимволов, вопросительный знак относится только к символу, расположенному непосредственно перед ним. Выражение colou?r интерпретируется как "c, затем o, затем l, затем o, затем u?, затем r".
Сопоставление u? с текстом всегда оказывается успешным: иногда ему соответствует символ u в тексте, иногда не соответствует. Собственно, главная особенность необязательного элемента ? состоит в том, что совпадение для него находится всегда. Это вовсе не означает, что совпадение будет найдено для любого регулярного выражения, содержащего метасимвол ?. Например, при поиске в строке semicolon будут найдены совпадения для colo и u? (соответственно colo и ничего). Тем не менее завершающее r не находится, из-за чего colou?r в конечном счёте и не совпадает в строке semicolon.
Рассмотрим другой пример. Представьте, что вам требуется найти дату - четвёртое июля, в которой месяц обозначается July или Jul, а число - fourth, 4th или просто цифра 4. Конечно, можно просто воспользоваться выражением (July|Jul)•(fourth|4th|4), но давайте рассмотрим другие варианты выражения той же идеи.
Во-первых, (July|Jul) сокращается до (July?). Вы видите, что это одно и то же? При удалении | круглые скобки перестают быть нужными. Вреда от скобок не будет, но без них выражение July? становится чуть более понятным. Получается July?•(fourth|4th|4).
Перед применением [b??] механизм регулярных выражений должен принять решение: попытаться найти совпадение для или пропустить его? Поскольку мы имеем дело с минимальным модификатором ??, сначала выбирается первый вариант.
Now that [b??] is next to be applied, the regex engine has a decision to make: attempt the or skip it? Well, since ?? is lazy, it specifically chooses to first skip the attempt.