Существенно расширить возможности конструирования регулярных выражений позволяет применение в них
метасимволов круглых скобок (). Аналогично их функциям в арифметических или алгебраических конструкциях, в
регулярных выражениях круглые скобки позволяют изменять естественный приоритет операций. Обычно они используются с целью ограничения области действия регулярных операций с низким приоритетом или группировки фрагментов
регулярных выражений для применения к ним
регулярных операций с высоким приоритетом. В частности, достаточно низкий приоритет имеет оператор объединения. Поэтому область действия оператора объединения распространяется на предельно длинные альтернативы из
литералов, которые находятся слева и справа от
метасимвола выбора |. Вставка круглых скобок в
регулярное выражение позволяет ограничить область действия оператора объединения альтернативами, которые оказались внутри них. Например, следующее
регулярное выражение обеспечивает распознавание во входном потоке либо альтернативы this and, либо альтернативы or that, информативность которых близка к нулю:
this[ ]and|or[ ]that
Однако вставка круглых скобок превращает его в следующее, потенциально более полезное
регулярное выражение:
this[ ](and|or)[ ]that
Это
регулярное выражение позволяет обнаруживать во входном потоке, очевидно, более информативные словосочетания this and that и this or that, чем рассмотренный выше вариант без круглых скобок. Так происходит потому, что в данном случае круглые скобки ограничивают область действия оператора объединения.
Анализируя возможности скобочных
регулярных выражений, следует обратить внимание на случай использовании конструкции выбора в сочетании с
якорями ^ и $, которые имеют еще более низкий приоритет, чем
операция объединения. Такое соотношение приоритетов обычно избавляет от необходимости применения круглых скобок при совместном использовании этих операторов в регулярном выражении. Например, при обработке файлов электронной почты бывает важно находить строки почтового сообщения, которые содержат директивы From: или Subject: в начале строки. На первый взгляд кажется, что требуемое соответствие обеспечивает только следующее скобочное регулярное выражение, где конструкцию выбора ограничивают круглые скобки, чтобы гарантировать поиск требуемых альтернатив исключительно в началах строк почтового файла:
^(From|Subject):
Однако, из-за различного приоритета операций ^ и |, это
регулярное выражение эквивалентно следующей конструкции выбора, где отсутствуют круглые скобки:
^From:|Subject:
В этом
регулярном выражении якорный префикс ^ по-прежнему относится к каждой из альтернатив, потому что приоритет операции оператора циркумфлекс меньше, чем приоритет оператора объединения. Таким образом, оба рассмотренных регулярных выражения гарантируют необходимый результат поиска директив From: и Subject: в почтовом сообщении. Однако более рациональный второй вариант, где отсутствуют круглые скобки, представляется более предпочтительным.
Использование этого технического приема иллюстрирует следующий пример. При обработке различных финансовых документов часто бывает необходимо обнаруживать записи денежных сумм в долларах с необязательным указанием центов. Одно из возможных решений этой задачи предоставляет следующее
регулярное выражения:
\$[0-9]+(\.[0-9][0-9])?
Это регулярное выражение состоит из трех частей: экранированный знак доллара \$, последовательность целых десятичных цифр для идентификации количества долларов в денежной сумме [0 9]+ и необязательный регулярный фрагмент (\.[0 9][0 9])?, содержащий экранированный символ точки, за которым следуют две десятичные цифры [0 9][0 9], определяющие число центов. Для группировки центовой части регулярного выражения используются круглые скобки, чтобы получить возможность квантифицировать находящийся в них регулярный фрагмент как будто это один символ.
Еще один пример, где круглые скобки используются в целях группировки различных фрагментов
регулярного выражения, предоставляет следующая конструкция, которая может быть полезна для распознавания бинарных последовательностей, где чередуются символы 0 и 1:
(01)*|(10)*|0(10)*|1(01)*
Хотя в этом
регулярном выражении вместе с
квантификаторами * присутствуют операторы объединения, круглые скобки используются исключительно для группировки
литералов 0 и 1 в бинарные пары. К этим парам применяются
квантификаторы *, чтобы развернуть их в бинарные последовательности, где чередуются символы 0 и 1. Конструкция выбора используется, чтобы объединить квантифицированные фрагменты в общее регулярное выражение, которое позволяет распознавать во входном потоке все возможные варианты чередующихся бинарных последовательностей.
В частности, две первые альтернативы обеспечивают поиск бинарных последовательностей, у которых первый и последний символы различны, например, 010101 или 101010. Две другие альтернативы позволяют находить бинарные последовательности, где первый и последний символ совпадают, например, 010 или 101.
Следует отметить, что рассмотренному
регулярному выражению эквивалентны следующие две более лаконичные конструкции:
1?(01)*0?
и
0?(10)*1?
Разумеется, возможна ситуация, когда в
регулярное выражение необходимо включить круглые скобки, как для группировки, так и для ограничения его регулярных фрагментов. Комбинированное применение круглых скобок для обеспечения этих двух функций демонстрирует следующее
регулярное выражение:
((0|1)(0|1)(0|1))*
Оно обозначает множество бинарных векторов, длина каждого из которых кратна трем. В частности, это
регулярное выражение позволяет обнаружить во входном потоке, бинарные последовательности 010 и 111011, длиной, соответственно, 3 и 6 символов.