Урок 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, чтобы при операциях поиска не учитывался регистр.

Поиск любого символа

Пока с помощью регулярных выражений мы находили статический (т.е. заранее заданный) текст. Теперь мы будем пытаться найти неизвестные символы.

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

В операции поиска файлов в DOS эквивалентом регулярного выражения . является ?. В 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, "Использование метасимволов".

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

Резюме

Регулярные выражения, называемые также шаблонами, являются строками, составленными из символов. Эти символы могут быть литералами (фактический текст) или символами (специальные символы со специальными значениями), и в этом уроке вы узнали, как найти один с используя либо текст-литерал, либо метасимвол. Точка . ответствует любому символу. Наклонная черта влево \ пользуется для защиты символов и в качестве начального символа в последовательности специальных символов.

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.