+ | 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
XML-формат
Адекватная спецификация в Glade-формате предполагает набор действий, предпринимаемых GUI- интерфейсом в ответ на действия пользователя. GUI-интерфейс
Программисту, освоившему подробности XML-формата, разметка
<?xml version='1.0'?>
<GTK-Interface>
<widget>
<class>GtkWindow</class>
<name>HelloWindow</name>
<border_width>5</border_width>
<Signal>
<name>destroy</name>
<handler>gtk_main_quit</handler>
</Signal>
<title>Hello</title>
<type>GTK_WINDOW_TOPLEVEL</type>
<position>GTK_WIN_POS_NONE</position>
<allow_shrink>True</allow_shrink>
<allow_grow>True</allow_grow>
<auto_shrink>False</auto_shrink>
<widget>
<class>GtkButton</class>
<name>Hello World</name>