Главная Обратная связь

Дисциплины:






Элементарные регулярные выражения



Элементарная структурная единица регулярного выражения — это символ. Текст можно искать по определенному набору букв и цифр. Рассмотрим пример, в котором с помощью регулярного выражения выделим из данных строк те, которые содержат сочетание букв 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

Метасимволы

 

Не все символы можно использовать прямо по назначению. Посмотрите, например, на конструкцию, которая описывалась в предыдущем разделе. Допустим, требуется найти в каком-то файле строки, содержащие следующий набор символов: abc[def. Можно предположить, что регулярное выражение будет составлено по принципам, описанным выше, но это неверно. Открывающая квадратная скобка — это один из символов, который несет для программы, работающей с регулярными выражениями, особый смысл (который был рассмотрен ранее). Такие символы называются метасимволами.

Метасимволы бывают разными и служат для различных целей. Из предыдущего материала можно выделить метасимволы открывающей и закрывающей квадратных скобок, а также символ ^. Символ «тире» не рассматривается как метасимвол, так как он имеет особое значение только внутри конструкции с квадратными скобками, а вне такой конструкции специально не применяется.

Рассмотрим те метасимволы, которые предполагают, что в конечном выражении на их месте будет стоять какой-либо символ или символы (табл. 7.1).

Таблица 7.1.Знакозаменяющие метасимволы

Метасим-вол Описание метасимвола
.(точка) Предполагает, что в конечном выражении на ее месте будет стоять любой символ. Продемонстрируем это на примере набора английских слов: Исходный набор строк: wake make machine cake maze Регулярное выражение: ma.e Результат: make maze
\w Замещает любые символы, которые относятся к буквам, цифрам и знаку подчеркивания. Пример: Исходный набор строк: abc а$с a1c а с Регулярное выражение: a\wc Результат: abc a1c
\W Замещает все символы, кроме букв, цифр и знака подчеркивания (то есть является обратным метасимволу \w). Пример: Исходный набор строк: abc а$с a1c а с Регулярное выражение: a\Wc Результат: а$с а с
\d Замещает все цифры. Продемонстрируем его действие на том же примере: Исходный набор строк: abc а$с a1c а с Регулярное выражение: a\dc Результат: alc
\D Замещает все символы, кроме цифр, например: Исходный набор строк: abc а$с alc а с
\D Регулярное выражение:a\Dc Результат: abc а$с а с
[\b] Замещает символ перевода курсора на один влево (возврат курсора)
\r Замещает символ перевода курсора в начало строки
\n Замещает символ переноса курсора на новую строку
\t Замещает символ горизонтальной табуляции
\v Замещает символ вертикальной табуляции
\f Замещает символ перехода на новую страницу
\s Равнозначен использованию пяти последних метасимволов, то есть вместо метасимвола \s можно написать [\r\n\t\v\f ], что, однако, не так удобно
\S Является обратным метасимволу \ s
     

 

Для лучшего понимания рассмотрим, что такое символ перевода курсора в начало строки, переноса курсора на новую строку и т. д. В конце каждой строки находятся один или два символа, которые указывают на необходимость перехода на новую строку. Начиная с операционной системы MS-DOS и до настоящего времени в операционных системах Microsoft используются два символа для обозначения переноса строки — сам символ переноса и символ возврата курсора в начало строки (заменяются метасимволами \n и \r соответственно), хотя в отдельности эти символы почти не применяются. В Linux используется только символ перехода на новую строку (заменяется метасимволом \n). Это следует учесть при составлении регулярных выражений.

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

 

Таблица 7.2.Метасимволы количества повторений

Символ Описание метасимвола
? Указывает обработчику регулярных выражений на то, что предыдущий символ, метасимвол или конструкция могут вообще не существовать в конечном тексте либо присутствовать, но иметь не более одного вхождения. Рассмотрим пример. Из данного набора строк требуется найти только те, в которых символу с может (но не обязательно) предшествовать один символ а,перед чем должен стоять символ b: Исходный набор строк: acbd aabc caab ecad bcde abac Регулярное выражение: b[Aa]?c Результат: aabc bcde abac
* Означает, что впереди стоящие символ, метасимвол либо конструкция могут как отсутствовать, так и быть в конечном выражении, причем количество вхождений неограниченно. Пример: из данного набора строк выделим те, в которых есть по крайней мере две буквы а, между которыми может быть либо отсутствовать некоторое количество цифр: Исходный набор строк: а123а а12а al23b alc3b b12а aaa Регулярное выражение: [Aa]\d*[Aa] Результат: al23a al2a aaa
+ Действие схоже с действием предыдущего символа с тем отличием, что впередистоящие метасимвол, символ или конструкция должны повторяться как минимум один раз. Рассмотрим предыдущий пример, но чтобы между буквами абыла хотя бы одна цифра: Исходный набор строк: а123а а12а al23b alc3b b12а aaa Регулярное выражение: [Аа]\d+[Aa] Результат: а123а а12а
{min, max} Иногда первых трех способов указания количества вхождений бывает недостаточно, так как они описывают количество не детально. Решить проблему можно следующим способом. Для указания количества вхождений символа либо конструкции после них ставят открывающие фигурные скобки и пишут минимальное количество вхождений. Если это количество фиксированное (то есть должно быть не больше и не меньше вхождений символа), то скобку закрывают; если должно быть не меньше указанного количества вхождений, то ставят запятую и закрывают скобку; если существует предельное количество вхождений, то после запятой указывают его и закрывают скобку. Так, эквивалентом знаку вопроса является конструкция {0,1}, знаку звездочки — { 0, }, знаку «плюс» — {1, }. Рассмотрим пример: Исходный набор строк: а123а а12а al23b alc3b b12а aaa Регулярное выражение: [Aa]\d{2,}[Аа] Результат: а123а а12а

Символ \b





sdamzavas.net - 2019 год. Все права принадлежат их авторам! В случае нарушение авторского права, обращайтесь по форме обратной связи...