Элементарные регулярные выражения
Элементарная структурная единица регулярного выражения — это символ. Текст можно искать по определенному набору букв и цифр. Рассмотрим пример, в котором с помощью регулярного выражения выделим из данных строк те, которые содержат сочетание букв bc (именно в этом порядке):
Исходный набор строк:
abc
abcd
dcba
adbc
Регулярное выражение:
bc
Результат:
abc
abcd
adbc
1.5.2. Конструкция вида [...]
Рассмотрим другой пример, заменив некоторые буквы в строках на заглавные:
Исходный набор строк:
аbС
abcd
dcba
adBc
Регулярное выражение:
bc
Результат:abcd
Результат обработки строк с помощью регулярного выражения изменился. При использовании вышеуказанного регулярного выражения в большинстве случаев чаще всего различают строчные и прописные буквы, что логически обосновано, если не указан соответствующий параметр, предписывающий не различать их. Программы, которые работают с регулярными выражениями чаще всего различают строчные и прописные буквы, если не указана соответствующая опция, предписывающая не различать строчные и прописные буквы.
В результате получается всего одна строка — вторая. Для вывода трех строк, как в первом примере, понадобится особая конструкция. Рассмотрим ее.
В основе данной конструкции лежат две квадратные скобки (открывающая и закрывающая), внутри которых расположены символы либо конструкции (последний случай будет описан далее), один из которых может быть на месте этой конструкции в итоговом выражении. Изменим регулярное выражение в предыдущем примере. Теперь задачей является сделать это регулярное выражение более универсальным, чтобы с его помощью можно было найти в исходном наборе строк сочетание bc независимо от того, в каком регистре находятся буквы в конечных выражениях.
Исходный набор строк:
аbС
abcd
dcba
adBc
Регулярное выражение:
[Вb][Сc]
Результат:
аbС
abcd
adBc
Теперь рассмотрим такой пример: с помощью регулярного выражения необходимо выделить из указанных в предыдущем примере строк те, которые содержат некоторую букву английского алфавита в нижнем регистре и сразу за ней — букву с в нижнем или верхнем регистре. При применении способа перечисления для решения поставленной задачи получится следующее регулярное выражение:
[abcdefghijklmnopqrstuvwxyz] [Cc]
Это верно, но строка получилась длинной, что особенно неудобно при составлении больших регулярных выражений. В подобных случаях можно перечислить все эти 26 символов короче, используя интервалы, то есть указать начальный и конечный символы, поставив между ними знак «тире». Рассмотрим пример:
Исходный набор строк:
аbС
abcd
dcba
adBc
Регулярное выражение:
[a-z][Cc]
Результат:
аbС
abcd
dcba
Здесь a-z — это и есть нужный интервал. Можно изменить пример так, чтобы первый символ мог быть как строчным, так и прописным, для чего сразу после первого интервала указываем второй:
Исходный набор строк:
аbС
abcd
dcba
adBc
Регулярное выражение:
[a-zA-Z][Cc]
Результат:
аbС
abcd
dcba
adBc
То же касается и цифр. Границами интервала могут быть любые символы, но последовательности типа [z-a] и [5-1] смысла иметь не будут, так как ASCII-код первого символа должен быть меньше либо равен коду завершающего. По поводу интервалов с цифрами следует напомнить, что символ нуля идет раньше символов всех остальных цифр. Количество стоящих рядом последовательностей неограниченно.
В этой же конструкции можно обратить (или, как еще говорят, инвертировать) выбор символов, поставив после знака открывающей квадратной скобки символ ^, после чего на месте конструкции будут предполагаться все символы, кроме указанных в ней самой. Рассмотрим это на предыдущем примере.
Из данного набора строк выделим только те, в которых буква b стоит перед любым символом, кроме буквы с.
Исходный набор строк:
аbС
abcd
dcba
adBc
Регулярное выражение:
[Bb][^Cс]
Результат:
dcba