lex (813547), страница 2
Текст из файла (страница 2)
Вданном случае экранировать пять обычных символов (ALPHA) в начале этой строки нетнеобходимости. В общем случае экранирование обычных текстовых символов необязательно,хотя никакого вреда не приносит. Например, следующее регулярное выражение полностьюаналогично предыдущему:"ALPHA++"Следует отметить, что кавычки обычно применятся для группового экранированияметасимволов. Отдельный метасимвол будет интерпретироваться как литерал, если врегулярном выражении ему предшествует знак обратной дробной черты (\). Например, вследующем регулярном выражении знак обратной дробной черты экранирует специальныйсмысл метасимвола *:ALPHA\*BETAЕще один пример индивидуального экранирования иллюстрирует следующее регулярноевыражение где обратная дробная черта экранирует метасимвол /:CAD\/CAMЭто регулярное выражение обеспечивает распознавание во входном потоке распространеннойаббревиатуры CAD/CAM, которая часто встречается в научно-технической литературе посистемам автоматизированного проектирования.Механизм экранирования может быть использован также при необходимости вставки врегулярное выражение символа пробела.
По определенным причинам, связанным сособенностями обработки регулярных выражений генератором LEX, символ пробел не можетбыть непосредственно включен в регулярное выражение как любой другой текстовый символ,например, буква или цифра. Поэтому любые пробелы, за исключением указанных в классахсимволов (смотрите ниже), должны экранироваться как, например, в следующем регулярномвыражении, где метасимволы кавычек необходимы для вставки пробела между словами regularи expression:regular" "expressionАналогичный результат предоставляет следующее регулярное выражение, где экранированиепробела обеспечивает метасимвол обратной дробной черты:regular\ expressionКОДЫ СИМВОЛОВ И ЛИТЕРАЛЬНЫЕ КОНСТАНТЫЭкранирующий символ обратной дробной черты также применяется в регулярных выражениях,чтобы специальным образом распознавать несколько наиболее часто употребляемыхобозначений литеральных констант языка программирования С.
В частности, литеральнаяконстанта \n обозначает символ перевода строки, а \t - символ горизонтальной табуляции.Имеется также возможность непосредственно специфицировать в регулярном выражении кодASCII любого символа в системе счисления по основанию 8, указав его после символа обратнойдробной черты. Например, в следующем регулярном выражении для обозначения пробеламежду словами Lexical и analyzer используется его ASCII-код, равный 40 в системе счисленияпо основанию 8:Lexical\040analyzerЛитеральные константы и ASCII-коды символов обычно применяются в регулярныхвыражениях для обозначения неотображаемых символов, которые проблематично выразитьиным способом. В частности, служебный символ Escape, который обычно используется дляформирования управляющих последовательностей, можно вставить в регулярное выражение,непосредственно специфицируя его ASCII-код, равный 033 в системе счисления пооснованию 8.Например, следующее регулярное выражение обозначает Escape последовательность, котораяобеспечивает очистку экрана консоли в режиме прозрачного ввода терминального интерфейсаOS UNIX и устанавливает текстовый курсор в левый верхний угол экрана:\033\[2JЯКОРНЫЕ МЕТАСИМВОЛЫНесмотря на то, что без обычных текстовых символов в большинстве случаев нельзя получитьпрактически полезные конструкции, основное значение при проектировании регулярныхвыражений имеют метасимволы, обозначающие регулярные операции.
Вероятно, простейшимирегулярными операциями, которые поддерживает генератор LEX, являются циркумфлекс (^), идоллар ($). Эти метасимволы используются, соответственно, для обозначения начала и концастроки входного потока.Например, следующее регулярное выражение может быть использовано для поиска директивы#define препроцессора системы программирования C, которая может находиться только вначалах строк исходного текста программы:^#defineС другой стороны, следующее регулярное выражение может быть полезно для поискапоследовательности символов, в частности слова cat, которое обозначает популярную командуконкатенации OS UNIX, в конце входной строки:cat$Если необходимо распознавать входную строку, содержащую только одно слово, например, cat,можно применить следующее регулярное выражение:^cat$В некоторых случаях полезно иметь возможность идентифицировать пустые строки входногопотока.
Один из возможных способов спецификации пустой строки предоставляет следующеерегулярное выражение:^$Следует отметить, что специфика метасимволов ^ и $ заключается в том, что они совпадают сопределенной позицией текста, в частности, действенны только на концах регулярноговыражения. По этой причине метасимволы ^ и $ иногда называют якорями или якорнымиметасимволами.
Большая часть остальных метасимволов предназначена для обработки текстабез привязки к фиксированной позиции входной строки.ВЫБОР АЛЬТЕРНАТИВЕсли якорные метасимволы относительно редко встречаются в конструкциях регулярныхвыражений и поддерживаются далеко не во всех диалектах регулярных выражений, то одной изнаиболее популярных регулярных операций является операция объединения.
Это классическаярегулярная операция, которая поддерживается большинством программных продуктов,ориентированных на обработку регулярных выражений. Для ее обозначения в регулярныхвыражениях используется метасимвол вертикальной черты |, который имеет аналогичныйсмысл логического оператора ИЛИ, например, в языках программирования C, C++, C# и Java.В алгебре регулярных выражений эта регулярная операция обеспечивает выбор любой извозможных альтернатив.
Она позволяет объединить несколько регулярных фрагментов в общеерегулярное выражение, которое специфицирует возможность совпадения данных входногопотока с любой из своих компонент.Пусть,например,имеетсяследующиедварегулярныхвыражения,обозначающихуменьшительное (Bob) и полное (Robert) английские имена:BobиRobertОперация объединения позволяет связать их в одно общее регулярное выражение, котороеобеспечивает совпадение с любым из входных слов, Bob или Robert. Объединенное регулярноевыражение имеет следующий вид:Bob|RobertОно отражает семантическую эквивалентность слов Bob и Robert, которая являетсяестественной, если рассматривать их как английские имена.КЛАССЫ СИМВОЛОВКонцептуально близкой к рассмотренной конструкции объединения является еще однарегулярная операция, которая обеспечивает выбор любого символа из заданного классасимволов.
Данная операция применяется, когда необходимо задать набор символов, которыемогут находиться в определенной позиции входной строки. Для обозначения класса символовприменяются метасимволы, образующие пару квадратных скобок []. Внутри квадратныхскобок должно быть задано множество символов, любой из которых может присутствовать вданной позиции входной строки. При этом следует учитывать, что внутри квадратных скобоккласса символов большая часть метасимволов игнорируется.
Специальными являются толькотри символа: обратная дробная черта (\), дефис (-) и циркумфлекс (^). Причем метасимвол(^) имеет различный специальный смысл внутри класс символов и вне его границ.Генератор LEX поддерживает различные способы спецификации множества символов класса.Можно специфицировать перечислительный, интервальный и инвертированный классысимволов. Допустимо также комбинировать различные способы спецификации в пределаходного класса символов.Наиболее простой, но не всегда возможный и рациональный способ – перечислить допустимыесимволы класса внутри квадратных скобок.
Например, необходимо выделять во входномпотоке слова GRAY или GREY, которые почти одинаковы, но отличаются только одной буквой.Для решения этой проблемы может быть применено следующее регулярное выражение, гдеиспользуется символьный класс [EA], состоящий из букв E и A:GR[EA]YЭто регулярное выражение позволяет интерпретировать входной поток следующим образом:найти символ G, за которым следует символ R, после которого должен быть символ E либосимвол A, и все это завершается символом Y. Кажется целесообразным отметить, что в данномслучае вместо класса символов можно применить операцию объединения и построитьследующее регулярное выражение:GRAY|GREYЭто регулярное выражение также как и предыдущая конструкция с классом символовобеспечивает выбор любого из двух допустимых альтернативных вариантов входного слова:GRAY или GREY.Таким образом, оба рассмотренных регулярных выражения гарантируют аналогичнуюобработку входного потока.