Урок 2. Поиск отдельных символов
20.03.2018
Категория: Регулярные выражения
В этом уроке вы научитесь выполнять простые операции поиска одного или нескольких символов.
Поиск заданного текста
Ben
— регулярное выражение. Поскольку это просто текст, он ничем не напоминает регулярное выражение, но он им таки является! Регулярные выражения могут содержать простой текст (и могут даже состоять только из простого текста). По общему признанию, это полностью вырожденная обработка регулярных выражений, но это самый простой пример для начала.
Так, здесь идет:
Текст
Hello, my name is Ben. Please visit my website at http://www.forta.com/.
Регулярное выражение
Ben
Результат
Hello, my name is Ben. Please visit
my website at http://www.forta.com/.
Используемое здесь регулярное выражение — буквальный текст, и оно находит вхождения Ben
в первоначальный текст.
Давайте рассмотрим другой пример, используя тот же текст для поиска, но другое регулярное выражение:
Текст
Hello, my name is Ben. Please visit my website at http://www.forta.coin/.
Регулярное выражение
my
Результат
Hello, my name is Ben. Please visit my website at http://www.forta.com/.
my
— также статический текст, но заметьте, что были найдены два вхождения my
.
Сколько вхождений?
По умолчанию большинство механизмов обработки регулярных выражений возвращает только первое вхождение. В предыдущем примере обычно было бы найдено только первое вхождение my
, но не второе.
Итак, почему было найдено два вхождения? В большинстве реализаций регулярных выражений предусмотрен механизм получения списка всех вхождений (обычно возвращаемых в массиве или в некотором другом специальном формате). В JavaScript, например, используя дополнительный флажок g
(глобальный), можно получить массив, содержащий все вхождения.
Указание зависимости от регистра
Регулярные выражения чувствительны к регистру, так что Ben
не будет соответствовать ben
. Однако большинство реализаций регулярных выражений позволяет находить вхождения независимо от регистра. В JavaScript, например, можно указать дополнительный флажок i
, чтобы при операциях поиска не учитывался регистр.
Поиск любого символа
Пока с помощью регулярных выражений мы находили статический (т.е. заранее заданный) текст. Теперь мы будем пытаться найти неизвестные символы.
Чтобы идентифицировать то, что разыскивается, в регулярных выражениях используются специальные символы или наборы символов. Символ .
(точка) соответствует любому символу.
.
является ?
. В SQL эквивалентом регулярного выражения .
является _
(символ подчеркивания).
Поэтому операция поиска c.t
найдет cat
и cot
(и другие бессмысленные слова).
Вот пример:
Текст
sales1.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls na1.xls na2.xls sa1.xls
Регулярное выражение
sales.
Результат
sales1.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls na1.xls na2.xls sa1.xls
Здесь используется регулярное выражение sales.
для того, чтобы найти все имена файлов, начинающихся с sales
, за которым следует еще один символ. Три из этих девяти файлов соответствуют шаблону.
Символ .
соответствует любому символу — символу алфавита, цифре и даже самой .
:
Текст
sales.xls sales1.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls na1.xls na2.xls sa1.xls
Регулярное выражение
sales.
Результат
sales.xls sales1.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls na1.xls na2.xls sa1.xls
Этот пример содержит один дополнительный файл, sales.xls
. Файл был найден с помощью шаблона sales.
, поскольку .
находит любой символ.
В шаблоне можно использовать несколько символов .
либо вместе (один за другим: ..
будет соответствовать любым двум символам друг рядом с другом), либо в различных местах шаблона.
Рассмотрим другой пример, в котором используется тот же самый текст. На сей раз вы должны найти все файлы для Северной Америки (na
) и Южной Америки (sa
) независимо от того, какая цифра следует после этих сокращений:
Текст
sales1.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls na1.xls na2.xls sa1.xls
Регулярное выражение
.a.
Результат
salesl.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls na1.xls na2.xls sa1.xls
Регулярное выражение .а.
действительно находит na1
, na2
и sa1
, но оно также нашло четыре других вхождения, которые не нужны. Почему? Потому что шаблон соответствует любым трем символам, средний из которых а
.
Необходим шаблон, соответствующий .а.
, за которым следует точка. Вот еще одна попытка:
Текст
salesl.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls nal.xls na2.xls sal.xls
Регулярное выражение
.a..
Результат
salesl.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls nal.xls na2.xls sa1.xls
Шаблон .a..
работает нисколько не лучше, чем .а.
; добавленная после а.
точка соответствует любому следующему символу. Как же тогда найти точку, если специальный символ "точка" соответствует любому символу?
Поиск специальных символов
Точка .
имеет специальное значение в регулярных выражениях. Если в шаблоне нужна точка .
, должен быть способ указать в регулярном выражении, что имеется в виду фактический символ .
, а не символ со специальным значением в регулярном выражении. Чтобы сделать это, предварите точку символом \
(наклонная черта влево). Наклонная черта влево \
— метасимвол (причудливый термин, обозначающий символ со специальным значением, в отличие от обычного символа). Поэтому точка .
соответствует любому символу, а наклонная черта влево с точкой \.
соответствует только самому символу точка .
.
Давайте снова попробуем выполнить предыдущий пример, на сей раз предваряя точку .
наклонной чертой \.
:
Текст
salesl.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls nal.xls na2.xls sal.xls
Регулярное выражение
.a.\.xls
Результат
salesl.xls orders3.xls sales2.xls sales3.xls apac1.xls europe2.xls nal.xls na2.xls sa1.xls
С помощью шаблона .а.\.xls
мы достигли цели. Первый символ .
соответствует n
(в первых двух вхождениях) или s
(в третьем). Второй символ .
соответствует 1
(в первом и третьем вхождениях) или 2
(во втором). Цепочка \.
соответствует точке .
, отделяющей имя файла от расширения, ну a xls
соответствует самому себе. (Фактически, соответствие работало бы и без xls
; добавление в конец xls
предотвратило нахождение имени файла вроде sa3.doc
.)
В регулярных выражениях \
всегда используется для того, чтобы отметить начало блока из одного или нескольких символов, которые имеют специальное значение. В предыдущем примере мы использовали \.
, а в следующих главах вы увидите еще много примеров использования \
.
О том, как применять специальные символы, вы узнаете из урока 4, "Использование метасимволов".
\
(т.е. выполнить поиск \
), используйте \\
(две наклонных черты влево).
.
соответствует любой символ, кроме символа новой строки.
Резюме
Регулярные выражения, называемые также шаблонами, являются строками, составленными из символов. Эти символы могут быть литералами (фактический текст) или символами (специальные символы со специальными значениями), и в этом уроке вы узнали, как найти один с используя либо текст-литерал, либо метасимвол. Точка .
ответствует любому символу. Наклонная черта влево \
пользуется для защиты символов и в качестве начального символа в последовательности специальных символов.