Чтение онлайн

на главную - закладки

Жанры

Программирование на Visual C++. Архив рассылки

Jenter Алекс

Шрифт:

$test = "hello out there, how are you";

$test =~ m/h.*?o/

найдет именно "hello", что и было нужно, поскольку ищет 'h', за которым следует несколько произвольных символов, до первого встреченного 'o'".

Концы и начала строк

Проверка начала или конца строки производится с помощью метасимволов ^ и $. Например, "^thing" соответствует строке, начинающейся с "thing". "thing$" соответствует строке, заканчивающейся на "thing". Эти символы работают только при включенной опции 's'. При выключенной опции 's' находятся только конец и начало текста.

Но и в этом случае можно найти конец и начало строки, используя escape-последовательности \A и \Z. Все это относится только к Perl-совместимым реализациям. Остальные же будут искать только конец и начало текста. В .Net имеется еще и символ \z, точный конец строки.

Граница слова

Для задания границ слова используются метасимволы '\b' и '\B'.

$test =~ m/out/

соответствует не только "out" в "speak out loud", но и "out" в "please don't shout at me". Чтобы избежать этого, можно предварить образец маркером границы слова:

$test =~ m/\bout/

Теперь будет найдено только "out" в начале слова. Не стоит забывать, что ВНУТРИ класса символов '\b' обозначает символ backspace (стирания).

Приведенные в Таблице 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.

Например,

$test = "I like apples a lot";

$test =~ m/like (apples|pines|bananas)/

сработает, поскольку "apples" – один из трех перечисленных вариантов. Скобки также поместят "apples" в $1 как обратную ссылку для дальнейшего использования. В основном это имеет смысл при замене, см. "Различия синтаксиса регулярных выражений".

Обратные ссылки, Lookahead– и Lookbehind-условия
Обратные
ссылки

Мы уже говорили об одной из важнейших возможностей регулярных выражений – способность сохранения части соответствий для дальнейшего использования. Кстати, избежать этого можно с помощью использования '?:'.

Например,

$test = "Today is monday the 18th.";

$test =~ m/([0-9]+)th/

сохранит "18" в $1, а

$test = "Today is monday the 18th.";

$test =~ m/[0-9]+th/

ничего не станет сохранять – из-за отсутствия скобок.

$test = "Today is monday the 18th.";

$test =~ m/(?:[0-9]+)th/

также ничего не станет сохранять благодаря использованию оператора '?:'.

Следующий пример демонстрирует, как можно использовать эту возможность в операции замены:

$test = "Today is monday the 18th.";

$test =~ s/ the ([0-9]+)th/, and the day is $1/

приведет к записи "Today is monday, and the day is 18." в переменную $test.

Можно ссылаться на подстроки, уже найденные данным запросом, используя \1, \2, …, \9. Следующее регулярное выражение удалит повторяющиеся слова:

$test = "the house is is big";

$test =~ s/\b(\S+)\b(\s+\1\b)+/$1/

записывает "the house is big" в $test.

Lookahead– и Lookbehind-условия

Иногда нужно сказать "найдите вот это, но только если перед ним не стоит вот этого", или "найдите вот это, но только если за ним не стоит вот этого". Пока речь идет об одиночном символе, достаточно воспользоваться [^…].

В более сложном случае придется использовать так называемые lookahead-условия или lookbehind-условия. Не путайте Positive lookahead с оптимистичным взглядом в будущее. Всего есть четыре типа таких условий:

• Положительное lookahead-условие '(?=re)'

Соответствует, только если за ним следует регулярное выражение re.

• Отрицательное lookahead-условие '(?!re)'

Соответствует, только если за ним не следует регулярное выражение re.

• Положительное lookbehind-условие '(?<=re)'

Соответствует, только если перед ним следует регулярное выражение re.

• Отрицательное lookbehind-условие '(?<!re)'

Соответствует, только если перед ним не следует регулярное выражение re.

Примеры:

$test = "HTML is a document description-language and not a programming-language";

$test =~ m/(?<=description-)language/

Найдет первое "language" ("description-language"), как предваряемое "description-", а

$test = "HTML is a document description-language and not a programming-language";

$test =~ m/(?<!description-)language/

Найдет второе "language" ("programming-language").

Следующие примеры выполнены в .Net. Поиск осуществляется в следующем тексте:

void aaa {

 if (…) {

try {

} catch(Exception e1) {

MessageBox.Show(e1.ToString, "Error");

} finally {

listBox1.EndUpdate;

Поделиться:
Популярные книги

Часовая башня

Щерба Наталья Васильевна
3. Часодеи
Фантастика:
фэнтези
9.43
рейтинг книги
Часовая башня

Попаданка в Измену или замуж за дракона

Жарова Анита
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Попаданка в Измену или замуж за дракона

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Жена на пробу, или Хозяйка проклятого замка

Васина Илана
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Жена на пробу, или Хозяйка проклятого замка

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Надуй щеки!

Вишневский Сергей Викторович
1. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки!

Случайная свадьба (+ Бонус)

Тоцка Тала
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Случайная свадьба (+ Бонус)

Газлайтер. Том 5

Володин Григорий
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 5

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Наследник 2

Шимохин Дмитрий
2. Старицкий
Фантастика:
попаданцы
альтернативная история
фэнтези
5.75
рейтинг книги
Наследник 2

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник