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

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

Жанры

Язык программирования Perl
Шрифт:

/само.а./ # соответствуют: 'самовар', 'самокат', 'самосад'...

# НЕ соответствуют: 'самолюб', 'самогон', 'самоход'...

В регулярном выражении можно задать несколько вариантов образца, любой из которых будет считаться соответствием строки образцу. Варианты образца - это набор возможных альтернатив, разделенных знаком "вертикальная черта" ('|'), который называется "метасимвол альтернатив" (alternation metacharacter). Поиск считается успешным, если найдено соответствие любой из альтернатив, например:

$text = 'Черная кошка в темной комнате'; # будем искать здесь

print "Нашли кошку!" if $text =~ /кот|кошка|котенок/;

Сравнение текста с вариантами образца выполняется слева направо, поэтому, если начало альтернатив совпадает, более длинную альтернативу нужно помещать в начало списка вариантов. Иначе всегда будет найдена более короткая. Значит шаблон в предыдущем примере правильнее записать в виде /котенок|кот|кошка/, чтобы в первую очередь поискать котенка, а затем - кота:

$text = 'Черный котенок в темной комнате'; # ищем здесь

print "Нашли котенка!" if $text =~ /кот.нок|кот|кошка/;

Чтобы сделать образец более универсальным, в первой альтернативе литерал заменен на шаблон с метасимволом "точка", чтобы находились соответствия слову "котенок" в любом написании - через "е" и через "ё". Часто применение регулярного выражения с альтернативами выглядит гораздо изящнее, чем длинное условное выражение:

return if $command =~ /exit|quit|stop|bye/i;

Если в образце после выбора из нескольких альтернатив применяются другие шаблоны или литералы, то конструкцию выбора нужно заключить в круглые группирующие скобки. Например:

$lotr =~ /(Bilbo|Frodo) Baggins/; # один из хоббитов

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

/[вклрт]от/ # соответствуют: 'вот','кот','лот','рот','тот'

Вот пример шаблона с несколькими классами символов, каждый из которых представляет одну букву в последовательности из четырех символов:

/[мс][ул][хо][ан]/ # соответствуют: 'муха', 'слон'

# а также: 'суоа', 'млхн', 'слоа' и так далее

В классе символов вместо перечисления можно указывать диапазон от начального до конечного символа, разделенных минусом:

[0-9] вместо [0123456789]

[A-Z] вместо [ABCDEFGHIJKLMNOPQRSTUVWXYZ]

Указывая несколько диапазонов в одном классе, запишем шаблон для шестнадцатеричной цифры:

/[0-9a-fA-F]/# соответствуют: '5', 'b', 'D' и так далее

Чтобы включить в символьный класс знак '-', нужно поместить его в начале или в конце перечисленных в классе символов или экранировать обратной чертой. Помещенные в символьный класс, все метасимволы (кроме ']') рассматриваются как обычные символы. Поэтому так могут выглядеть шаблоны для поиска знака препинания или одной из скобок:

[-.,;:!?] # знаки препинания

[[\]{}] # скобки: \] представляет скобку ']'

Иногда требуется выразить понятие "все, кроме указанных символов": для этого в описании класса символов сразу после открывающей квадратной скобки ставится метасимвол отрицания ('^'). Например, так можно записать шаблоны для "любого символа, кроме знаков препинания" или "любого нецифрового символа":

[^-.,;:!?] # все, кроме этих знаков препинания

[^0-9] # не цифры

Чтобы включить в символьный класс символ '^', нужно поставить его не первым в списке символов или отменить его специальное значение с помощью символа '\':

[*^] или так: [\^]

Для сокращенной записи классов символов в регулярных выражениях предусмотрены специальные обозначения, состоящие из латинской буквы с обратной косой чертой перед ней. Вот они:

\d - любая десятичная цифра, то есть [0-9]

\D - любой символ, кроме цифры: [^0-9] или [^\d]

\w - символ, пригодный для записи идентификатора:[a-zA-Z0-9_]

\W - противоположность символа \w, то есть [^\w]

\s - пробельный символ: пробел, \t, \n, \r или \f

\S - любой не пробельный символ, то есть [^\s]

С помощью этих метасимволов можно составлять гораздо более интересные образцы. Например, проверим, содержится ли в тексте число из четырех цифр, окруженное любыми пробельными символами:

$text = "Альбом 'Dire Straits'\tГод 1978\tВремя 41:21";

$text =~ m{\s\d\d\d\d\s}; # найдет ' 1978\t'

Записывать несколько метасимволов подряд для указания в шаблоне последовательности из однотипных символов утомительно и неудобно, да и ошибиться при этом легко. Облегчить жизнь составителям регулярных выражений помогают квантификаторы.

Квантификатор (quantifier) - это обозначение числа повторений предыдущего шаблона при поиске соответствия. Количество повторений может задаваться одним или парой десятичных чисел в фигурных скобках:

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

Купеческая дочь замуж не желает

Шах Ольга
Фантастика:
фэнтези
6.89
рейтинг книги
Купеческая дочь замуж не желает

Первый среди равных. Книга IX

Бор Жорж
9. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IX

Государь

Мазин Александр Владимирович
7. Варяг
Фантастика:
альтернативная история
8.93
рейтинг книги
Государь

Матабар III

Клеванский Кирилл Сергеевич
3. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар III

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

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

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

Древесный маг Орловского княжества 5

Павлов Игорь Васильевич
5. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 5

Атаман царского Спецназа

Корчевский Юрий Григорьевич
Боевая фантастика Ю. Корчевского
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.00
рейтинг книги
Атаман царского Спецназа

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
7.00
рейтинг книги
Солнечный корт

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

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

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

Вперед в прошлое 8

Ратманов Денис
8. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 8

Эволюционер из трущоб. Том 2

Панарин Антон
2. Эволюционер из трущоб
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 2

Черный Маг Императора 26

Герда Александр
26. Черный маг императора
Фантастика:
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 26