Jenter Алекс
Шрифт:
Приведенные в Таблице 3 метасимволы не заставляют машину регулярных выражений продвигаться по строке или захватывать символы. Они просто соответствуют определенному месту строки. Например, ^ определяет, что текущая позиция – начало строки. '^FTP' возвращает только те "FTP", что находятся в начале строки.
Символ | Значение |
---|---|
^ | Начало строки. |
$ | Конец строки, или перед \n в конце строки (см. опцию m). |
\A | Начало строки (ignores the m option). |
\Z | Конец строки, или перед \n в конце строки (игнорирует опцию m). |
\z | Точно конец строки (игнорирует опцию m). |
\G | Начало текущего поиска (Часто это в одном символе за концом последнего поиска). |
\b | На границе между \w (алфавитно-цифровыми) и \W (не алфавитно-цифровыми) символами. Возвращает true на первых и последних символах слов, разделенных пробелами. |
\B | Не на \b-границе. |
Символ '|' можно использовать для перебора нескольких вариантов. Использование этого символа совместно со скобками – '(…|…|…)' – позволяет создать группы вариантов. Скобки используются для "захвата" подстрок для дальнейшего использования и сохранения их во встроенных переменных $1, $2, …, $9.
Например,
сработает, поскольку "apples" – один из трех перечисленных вариантов. Скобки также поместят "apples" в $1 как обратную ссылку для дальнейшего использования. В основном это имеет смысл при замене, см. "Различия синтаксиса регулярных выражений".
Мы уже говорили об одной из важнейших возможностей регулярных выражений – способность сохранения части соответствий для дальнейшего использования. Кстати, избежать этого можно с помощью использования '?:'.
Например,
сохранит "18" в $1, а
ничего не станет сохранять – из-за отсутствия скобок.
также ничего не станет сохранять благодаря использованию оператора '?:'.
Следующий пример демонстрирует, как можно использовать эту возможность в операции замены:
приведет к записи "Today is monday, and the day is 18." в переменную $test.
Можно ссылаться на подстроки, уже найденные данным запросом, используя \1, \2, …, \9. Следующее регулярное выражение удалит повторяющиеся слова:
записывает "the house is big" в $test.
Иногда нужно сказать "найдите вот это, но только если перед ним не стоит вот этого", или "найдите вот это, но только если за ним не стоит вот этого". Пока речь идет об одиночном символе, достаточно воспользоваться [^…].
В более сложном случае придется использовать так называемые lookahead-условия или lookbehind-условия. Не путайте Positive lookahead с оптимистичным взглядом в будущее. Всего есть четыре типа таких условий:
• Положительное lookahead-условие '(?=re)'
Соответствует, только если за ним следует регулярное выражение re.
• Отрицательное lookahead-условие '(?!re)'
Соответствует, только если за ним не следует регулярное выражение re.
• Положительное lookbehind-условие '(?<=re)'
Соответствует, только если перед ним следует регулярное выражение re.
• Отрицательное lookbehind-условие '(?<!re)'
Соответствует, только если перед ним не следует регулярное выражение re.
Примеры:
Найдет первое "language" ("description-language"), как предваряемое "description-", а
Найдет второе "language" ("programming-language").
Следующие примеры выполнены в .Net. Поиск осуществляется в следующем тексте: