Метасимволы и операторы в регулярных выражениях



В таблице 2.1 приведены метасимволы и операторы, используемые в регулярных выражениях.

 

Таблица 2.1

Метасимволы и операторы регулярных выражений

Метасимвол / оператор Значение
. Любой отдельный символ кроме символа перевода строки
^ Начало строки
$ Конец строки
[ ] Любой символ из заключенных в скобках (возможно задание диапазона символов, указав начальный и последний символы диапазона через дефис)
[^] Любой символ, кроме тех, что указаны в скобках
* Предшествующий шаблон встречается ноль и более раз
{n} Предшествующий шаблон встречается ровно n раз
{n,} Предшествующий шаблон встречается не менее, чем n раз
{,n} Предшествующий шаблон встречается не более, чем n раз
{n,m} Предшествующий шаблон встречается не менее n, чем n и не более, чем m раз
? Предшествующий шаблон встречается не более одного раза (расширение для egrep и awk)
+ Предшествующий шаблон встречается один и более раз (расширение для egrep и awk)
( ) Применяются для группировки выражений для последующего выполнения операций над ними
| Позволяет разделить допустимые варианты (логическое ИЛИ)
\ Отмена специального значения метасимвола, следующего за ним

 

Синие строки таблицы соответствуют метасимволам, а зеленые – операторам. Особенностью операторов является то, что они не могут применяться самостоятельно, без указания символа, относительно которого они действуют. Оператор действует на обычный или метасимвол, стоящий перед ним.

 

Якорные метасимволы

Метасимвол .

Метасимвол . используется для поиска в тексте одиночных символов, кроме символа перевода строки.

Например, если требуется найти слова, начинающиеся на abc, заканчивающиеся символом z и состоящие из 5 символов, необходимо использовать шаблон

Abс . z

Шаблону соответствуют следующие варианты: abc d z, abc 1 z. Вариант abc dd z не соответствует шаблону, так как вместо единичного символа между abc и z стоят два символа dd. Шаблоном для такого слова будет

Abс .. z

Если требуется найти все слова, состоящие из 4 слов и начинающиеся на букву A, необходимо указать следующий шаблон

A …

 

Метасимвол ^

Якорный метасимвол ^ используется для поиска буквосочетаний или единичного символа, стоящих в начале строки.

Так шаблон

^ abс

реализует поиск cтрок, начинающихся с буквосочетания abc. Шаблону соответствуют строки abc, abczzz. Строка dabc не соответствует шаблону так как буквосочетание abc находится не в начале слова.

 

Метасимвол $

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

Шаблону

de $

соответствуют все строки, заканчивющиеся буквосочетанием de, например, de, abcde.

Следующий шаблон соответствует пустой строке:

^ $

Для поиска строк, состоящих только из одного символа, используется следующий шаблон:

^. $

Якорные метасимволы ^и $предназначены для обработки текста с привязкой к начальной и конечной позициям регулярного выражения соответственно. По этой причине их называют якорями.

 

Выбор альтернатив

Операция объединения обозначается метасимволом вертикальной черты | и часто используется в регулярных выражениях. Она поддерживает возможность выбора одной из возможных альтернатив, что позволяет объединять несколько регулярных фрагментов в общее регулярное выражение. Так два регулярных фрагмента UNIX и Windows могут быть связаны в одно общее регулярное выражение, обеспечивающее совпадение с любым из входных слов:

UNIX|Windows

Выражению будут соответствовать слова '' UNIX'' и '' Windows''.

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

.|\n

 

Классы символов [ ]

Операция [ ] применяется когда необходимо задать набор символов, которые могут находиться в определенной позиции строки. Множество символов, каждый из которых может быть указан в текущей позиции, должны быть указаны внутри квадратных скобок.

Например шаблон

[ Aa ] bc

будет соответствовать строкам Abc и abc.

Такую конструкцию можно заменить операцией объединения и представить шаблон в виде

Abc | abc

Все метасимволы, указанные внутри [ ] «теряют» свои специальные свойства и интерпретируются как обыкновенные литералы. Исключение составляют три метасимвола

\ - ^

При этом метасимволы дефис - и циркуфлекс ^ интерпретируются различно в зависимости от местоположения внутри регулярного выражения, а метасимвол \ сохраняет свое специальное значение вне зависимости от контекста.

Классы символов, указанные внутри скобок могут быть:

· перечислительными;

· интервальными;

· инвертированными.

Перечислительная спецификация класса подразумевает последовательное указание всех символов класса, например,

[ 0123456789., ]

соответствует любому из перечисленных в скобках символу.

Если коды символов класса образуют непрерывную возрастающую последовательность, то удобно использовать интервальную спецификацию, где первый и последний символ последовательности разделяет знак дефиса. Так регулярное выражение

[ 0-9 ]

соответствует любой цифре от 0 до 9. При этом первый символ задаваемого диапазона должен иметь код ASCII меньший, чем последний. А противном случае, диапазон будет интерпретирован как три независимых символа 9, 0 и дефис - для следующего регулярного выражения

[ 9-0 ]

Число интервалов в классе может быть произвольным, например, регулярное выражение

[ 0-9a-zA-Z ]

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

[ 0-9abcdefABCDEF ]

Если дефис - должен интерпретироваться в классе символов как символ, то он должен быть поставлен в начала или конце последовательности символов. Выражение

[ -+0-9 ] или [ +0-9- ]

соответствует знакам +, - или любой цифре.

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

[1-9][0-9]

Часто бывает удобнее указать символы, которые не принадлежат некоторому диапазону, чем перечислять их. В этом случае используется инвертируемая запись, для задания которой первым в классе символов указывается ц иркумфлекс ^.

[ Aa ][^ 0-9 ]

Такая запись предполагает, что на первой позиции слова должна стоять буква A или a, а на второй позиции может идти любой символ, кроме цифры.

Циркумфлекс ^, расположенный в начале класса символов, инвертирует все символы, расположенные внутри. Так регулярное выражение

[^ .,a-zA-Z ]

соответствует любому символу кроме латинских букв, а также знаков . и , .

Если ^ поставить в середину или конец описания класса символов, он потеряет свое специальное назначение и будет интерпретирован как любой другой символ (литерал).

Следует также помнить, что символ циркумфлекс ^ имеет различный смысл внутри определения класса символов [ ] (инверсия) и за его границами (начало строки).

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

[ \n\t ]

соответствует двум знакам – горизонтальной табуляции и переводу строки соответственно.

Операцию [ ] можно использовать для экранирования знака пробела, который не является метасимволом, но требует экранирования при вставке в регулярное выражение. Внутри [ ] пробел не требует экранирования.

abc [ ] dfg

 

Квантификаторы

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

?   + * { }

Кватификаторы указываются после литерала или класса символов, проверку повторения которых необходимо реализовать.

 

Квантификатор ?

Данный квантификатор указывает на то, что предшествующий ему символ или класс символов может встречаться 0 или 1 раз. Например, шаблону

Abc ? d

соответствуют два буквосочетания: Abcd и Abd (в данном случае буква c является необязательной).

 

Квантификатор *

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

[ 1-9 ][ 0-9 ]*

Квантификатор +

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

[ 1-9 ][ 0-9 ]*\ . [ 0-9 ]+

Регулярные выражения

[ 0-9 ]+

и

[ 0-9 ][ 0-9 ]*

являются эквивалентными.

 

Интервальный квантификатор { }

Позволяет задавать наименьшее обязательное и наибольшее возможное число повторений символа. Квантификатор имеет структуру

символ {n,m}

где n и m – целые неотрицательные десятичные числа, определяющие минимальное и максимальное количества повторений символа или фрагмента регулярного выражения, соответственно. Для n и m должна выполняться зависимость

n =< m

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

[ A-Za-z ] { 0,5 }

Слова, состоящие строго из 5 латинских букв любого регистра, можно задать с помощью шаблона

[ A-Za-z ] { 5,5 }

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

 

Группировка и ограничение

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

Рассмотрим шаблон

a [ ] b | c [ ] d

В связи с тем, что оператор [ ] имеет более высокий приоритет, чем | , шаблону будут соответствовать варианты записей a b и с d. Если изменить шаблон, добавив в него метасимвол ( ),

a [ ]( b | c )[ ] d

то выражению будут соответствовать строки вида a b d или a c d, так как будет изменен исходный приоритет операций.

Кроме того, круглые скобки ( ) позволяют объединять символы в последовательности, операторы к которым применяется совместно. Например, шаблону

Abс +

соответствует строкам Abс, Abсс, Abссссс и пр. (то есть оператор + применен лишь к последнему символу регулярного выражения).

Регулярному выражению

A ( bс )+

соответствуют строки Abс, Abсbс, Abсbсbсbсbс и пр.

 


Дата добавления: 2020-01-07; просмотров: 187; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!