Таблица 8.2. Введение в операции с регулярными выражениями
Символ-шаблон |
Поддерживается |
Соответствующая строка |
\ |
во всех |
Начало escape-последовательности. Определяет, следует ли интерпретировать последующий знак как шаблон. Последующие буквы или цифры интерпретируются различными способами в зависимости от программы |
. |
во всех |
Любой символ |
^ |
во всех |
Начало строки |
$ |
во всех |
Конец строки |
[...] |
во всех |
Любой из символов, указанных в скобках |
[^...] |
во всех |
Любые символы, кроме указанных в скобках |
* |
во всех |
Любое количество экземпляров предыдущего элемента |
? |
egrep/Emacs, Perl/Python |
Ни одного или один экземпляр предыдущего элемента |
+ |
egrep/Emacs, Perl/Python |
Один или несколько экземпляров предыдущего элемента |
{n} |
egrep, Perl/Python; как \{n\} в Emacs |
В точности n повторений предыдущего элемента. Не поддерживается некоторыми старыми regexp-средствами |
{n,} |
egrep, Perl/Python; как \{n,\} в Emacs |
n или более повторений предыдущего элемента. Не поддерживается некоторыми старыми regexp-средствами |
{m,n} |
egrep, Perl/Python; как \{m,n\} в Emacs |
Минимум m и максимум n повторений предыдущего элемента. Не поддерживается некоторыми старыми regexp-средствами |
| |
egrep, Perl/Python; как \| в Emacs |
Элемент слева или справа. Обычно используется с некоторой формой группирующих разделителей |
(...) |
Perl/Python; как \(...\) в более старых версиях |
Интерпретировать данный шаблон как группу (в более новых regexp-функциях, например в языках Perl и Python). Более старые средства, такие как regexp-функции в Emacs и в утилите grep требуют записи \(...\) |
В новых языках с поддержкой регулярных выражений установилась практика Perl/Python-варианта. Он является более прозрачным, чем остальные, особенно потому, что обратная косая черта перед не алфавитно-цифровым символом всегда означает, что данный символ трактуется буквально, что значительно устраняет путаницу при ссылке на элементы регулярных выражений.
Регулярные выражения являются исключительным примером того, насколько лаконичным может быть мини-язык. Простые регулярные выражения отражают режим распознавания, который иначе пришлось бы реализовывать с помощью сотен строк туманного, чреватого ошибками кода.
8.2.3. Учебный пример: Glade
Glade представляет собой средство разработки интерфейсов для библиотеки Х-инструментария [80] Для тех, кто не является Unix-программистом: инструментарий X представляет собой графическую библиотеку, которая предоставляет GUI-объекты (такие как надписи, кнопки и выпадающие меню) подключенным к ней программам. В большинстве других операционных систем с графическим интерфейсом предоставляется только один инструментарий, используемый всеми. Unix и сервер X поддерживают несколько инструментариев. Это является частью разделения политики и механизма, которое в главе 1 было названо целью проектирования X-сервера. GTK и Qt являются двумя наиболее популярными X-инструментариями с открытым исходным кодом.
GTK с открытым исходным кодом. Glade позволяет разрабатывать GUI-интерфейс путем интерактивного выбора, размещения и модификации элементов управления на панели интерфейса. GUI-редактор создает XML-файл, описывающий проектируемый интерфейс. Полученный файл, в свою очередь, можно передать одному из нескольких генераторов кода, которые непосредственно создают С, С++, Python- или Perl-код для интерфейса. Сгенерированный код затем вызывает создаваемые разработчиком функции, определяющие поведение интерфейса.
XML-формат Glade для описания GUI-интерфейсов является хорошим примером простого узкоспециального мини-языка. В примере 8.1 показан Glade-формат для GUI-интерфейса "Hello, world!".
Адекватная спецификация в Glade-формате предполагает набор действий, предпринимаемых GUI-интерфейсом в ответ на действия пользователя. GUI-интерфейс Glade интерпретирует данные спецификации как структурированные файлы данных. С другой стороны, генераторы кода Glade используют их для написания программ, реализующих GUI. Для некоторых языков (включая Python) существуют библиотеки времени выполнения, которые позволяют пропустить этап генерирования кода и просто создавать GUI непосредственно во время обработки XML-спецификации (интерпретируя Glade- разметку вместо того, чтобы компилировать ее). Таким образом, разработчик получает выбор: эффективное использование пространства ценой скорости запуска или наоборот.
Читать дальше