# Редактор регулярных выражений

Jesper K.
Pedersen

    blackie@kde.org

2001-07-03
0.1
&underFDL;
2001
Jesper K. Pedersen

Это руководство описывает виджет встроенного редактора регулярных выражений.

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

## Введение

Редактор регулярных выражений предназначен для редактирования регулярных выражений в графическом виде (в отличие от текстовых строк). Традиционно, регулярные выражения имеют ASCII синтаксис, к примеру: `^.*kde\b`. Основными недостатками данного стиля являются:

- Сложность применения для людей, не занимающихся программированием.

- Необходимость экранировать определённые символы (например, чтобы использовать символ звёздочки, придётся набрать `\*`).

- Необходимость постоянно помнить и соблюдать правила приоритетов выполнения - что делает операция `x|y*`? Значение `x` или множество `y`, ИЛИ множества `x` и `y` смешаны?

The regular expression editor, on the other hand, lets you draw your regular expression in an unambiguous way. The editor solves at least item two and three above. It might not make regular expressions available for the non-programmers, though only tests by users can tell that. So, if are you a non programmer, who has gained the power of regular expression from this editor, then please let me know.

## Что такое регулярное выражение?

A regular expression is a way to specify conditions to be fulfilled for a situation in mind. Normally when you search in a text editor you specify the text to search for literally, using a regular expression, on the other hand, you tell what a given match would look like. Examples of this include I'm searching for the word KDE, but only at the beginning of the line, or I'm searching for the word `the`, but it must stand on its own, or I'm searching for files starting with the word `test`, followed by a number of digits, for example `test12`, `test107` and `test007`

You build regular expressions from smaller regular expressions, just like you build large Lego toys from smaller subparts. As in the Lego world, there are a number of basic building blocks. In the following I will describe each of these basic building blocks using a number of examples.

### Поиск обычного текста

If you just want to search for a given text, a then regular expression is definitely not a good choice. The reason for this is that regular expressions assign special meaning to some characters. This includes the following characters: `.*|$`. Thus if you want to search for the text `kde.` (i.e. the characters `kde` followed by a period), then you would need to specify this as `kde\.` The regular expression editor solves this problem by taking care of escape rules for you. Writing `\.` rather than just `.` is called escaping.

### Matching URLs

Когда вы выбираете нечто похожее на URL в KDE, то программа `klipper` предложить вам открыть этот URL при помощи `konqueror`.

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

Регулярное выражение для URL содержит (помимо всего прочего) условие, что текст должен начинаться с `http://`. С помощью регулярного выражения это условие можно описать следующим образом: `http://` со шляпой (с символом `^`).

Предыдущий пример показывает, как с помощью регулярных выражений можно указать расположение искомого фрагмента в тексте (совпадение позиции). Аналогично можно указать на то, что искомый фрагмент находится в конце строки , для этого используется символ `$` (символ доллара).

### Поиск слова `the`, но не the `re`, `brea` the или `ano` the `r`

По образу и подобию вышеизложенного могут быть указаны ещё два дополнительных условия при поиске, а именно: позиция на границе слова (в начале, либо конце) и не на границе слова. Для обозначения этих условий применяются обозначения `\b` (указание на границу слова) и `\B` (не на границе слова).

Таким образом слово `the` можно найти, воспользовавшись регулярным выражением `\bthe\b`. Этим мы указываем, что ищем просто слово `the` без каких-бы то ни было довесков перед и после слова (т.е с границами по каждой из сторон слова)

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

### Поиск всех `this` или `that`

Представьте себе, что вы хотите найти в документе слово `this` или слово `that`. При обычном поиске вам необходимо сделать два прохода: в первый произвести поиск слова `this`, во второй - `that`.

Используя регулярные выражения, вы можете сделать всё это за один приём. Для этого запишите выражение следующим образом: `this|that`, т.е. разделите оба искомых слова вертикальной чертой. Обратите внимание, что по обе стороны от вертикальной черты могут находиться не только искомые слова, но и два регулярных выражения.

In the regular expression editor you do not write the vertical bar yourself, but instead select the alternative tool, and insert the smaller regular expressions above each other.

### Совпадение с произвольным условием

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

- `ls *.txt` - here `*.txt` is the shell wildcard matching every file ending with the `.txt` extension.

- `cat test??.res` - вывод всех файлов, начинающихся с `test`, за которым следуют два любых символа, и заканчивающихся на `.res`.

В оболочке звёздочка указывает, что любой символ может встретиться в названии любое количество раз, другими словами, звёздочка означает всё, что угодно. В регулярном выражении подобное условие задаётся при помощи записи `.*`. Точка указывает, что может быть один произвольный символ, в свою очередь звёздочка сообщает, что предыдущее регулярное выражение может соответствовать любое количество раз. Вместе они задают условие поиска: любой единичный символ может быть встречен произвольное количество раз.

Это может на первый взгляд показаться чрезмерно сложным, но когда вы увидите всю картину работы регулярных выражений,то сможете по достоинству оценить всё их изящество. Позвольте продемонстрировать ещё одно основное выражение: `a`. Эта запись указывает, что регулярное выражение ищет соответствие одиночному символу `a`. Если объединить эту запись со звёздочкой, т.е. `a*`, то получится регулярное выражение допускающее любое количество символов a.

Можно объединять несколько регулярных выражений последовательно, например `ba(na)*`. Запись `(na)*` указывает, что строка в скобках может повторяться любое количество раз. Представьте себе, что работая в текстовом редакторе, вы должны найти следующие слова: `ba`, `bana`, `banana`, `bananananananana`

Как сказано выше, не составляет труда записать шаблон оболочки: `test??.res` через регулярное выражение: `test..\.res`. Вообще-то точка означает любой символ. Для того чтобы указать что нужна именно точка, вы должны записать `\.` Здесь использована управляющая последовательность. Во всех словах регулярное выражение `\.` означает точка, а просто точка - соответствие любому символу в данной позиции.

In the regular expression editor, a repeated regular expression is created using the repeat tool

### Replacing `&` with `&amp;` in a HTML document

В документе HTML, для того чтобы отображался специальный символ `&`, его необходимо записать как `&amp;` - по аналогии с тем, как происходит замена служебных символов на управляющие последовательности в регулярных выражениях.

Представьте себе, что вы набрали документ HTML в обычном текстовом редакторе (XEmacs, Kate или Notepad), и полностью забыли про эти правила. Для того чтобы устранить ошибку, необходимо заменить все записи `&` на `&amp;`.

This can easily be done using normal search and replace, there is, however, one glitch. Imagine that you did remember this rule - just a bit - and did it right in some places. Replacing unconditionally would result in `&amp;` being replaced with `&amp;amp;`

На самом деле вы хотите произвести замену записи `&` только в том случае, если за ней не стоит `amp;`. Для этого вы должны воспользоваться регулярными выражениями, использующими запрещения.

Для того чтобы выполнить условие, при котором за искомым не должно стоять `amp;`, необходимо записать следующее выражение: `&(?!amp;)`. Гораздо проще всё будет выглядеть в редакторе регулярных выражений, если вы воспользуетесь инструментами запрета/расширения.

## Работа с редактором регулярных выражений

В этой главе рассказывается о работе непосредственно с редактором регулярных выражений

### Организация рабочего окна

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

Выше области редактирования расположены две панели инструментов. Первая панель содержит средства редактирования и очень похожа на инструменты для рисования в графических программах. Вторая панель содержит кнопку Что это? и кнопки отмены и повтора.

Ниже области редактирования находится строка регулярного выражения в текстовом (ASCII) виде. Все изменения, вносимые в графическом редакторе переносятся в текстовую форму. Если вы захотите поправить регулярное выражение в текстовом виде, то все изменения также будут внесены в графическое представление.

Наконец, слева от области редактирования есть много заготовок регулярных выражений. Они служат для достижения двух целей: (1) Когда вы используете редактор, эти выражения являются более качественными или, если хотите, более исчерпывающими, заменяя общие регулярные выражения. На рисунке выше вы можете увидеть, как текстовое представление ".*" заменяется на шаблонное "всё что угодно".(2) Вы можете использовать эти заготовки в качестве строительного материала для построения своих регулярных выражений. За более исчерпывающей информацией обратитесь к разделу регулярные выражения, определяемые пользователями, где содержится подробная информация о том, как сохранить ваши собственные регулярные выражения.

### Средства редактирования

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

Все инструменты расположены на панели инструментов, выше области редактирования. Далее будет описан каждый из инструментов.

#### Выделение

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

#### Текст

Используя этот инструмент вы можете вставить обычный текст, при этом не заботясь о наличии и необходимости замены специальных символов. Далее в примере будет создано регулярное выражение: `abc\*\\\)`

#### Символ

Используя этот инструмент, вы определяете области значений символьных величин. К примеру, что в тексте содержатся символы `[0-9]`, `[^a-zA-Z,_]`. Если вы воспользовались данным инструментом, то должен появиться диалог, в котором определяются области значений символьных величин.

См. также повторение регулярных выражений.

#### Любой символ

Регулярное выражение "точка" (.). Точка соответствует любому одиночному символу.

#### Повторение

Повторяющиеся элементы. Включают в себя звёздочку (*), плюс (+), знак вопроса (?) и интервал ({3,5}). Если вы используете этот инструмент, то появится диалог, в котором вы должны указать необходимое количество повторов.

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

Повторяемые элементы выражения можно взять извне, затем поместить в квадрат. Также вы можете сперва нарисовать то что потом должно будет быть повторено, а затем выбрать инструмент повторения. И наоборот: вы можете сперва вставить повторитель, а затем нарисовать внутри него повторяемое.

См. повторяемые регулярные выражения.

#### Варианты

Задание альтернативы - это использование оператора(|). Вы рисуете другой вариант поверх имеющегося, после того как в редакторе появится новый квадратик для ввода.

См. раздел альтернативные регулярные выражения

#### Составное выражение

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

#### Начало/конец строки

Инструменты начала и конца строк указывают на соответствие условиям начала и конца строки. Регулярное выражение в приведённом выше примере рабочего окна редактора не содержит символов соответствия начала/конца строк.

См. сопоставление позиций в регулярных выражениях.

#### (Не)граница слова

Инструментальные средства границ позволяют задавать условия соответствие границам или содержимому слова. Регулярное выражение, изображённое на рисунке, совпадает с любыми словами, начинающимися с `the`. Само слово `the` не совпадает с этим условием.

См. описание в разделе границы в регулярных выражениях.

#### Упреждающий поиск (по отрицанию)

Инструментальные средства условий разрешения/блокировки определяют будут ли приняты результаты по конкретному условию. Частное решение, тем не менее, не является частью общего.

Note: You are only allowed to place lookaheads at the end of the regular expressions. The Regular Expression Editor widget does not enforce this.

См. описание в разделе блокировки и разрешения в регулярных выражениях.

### Регулярные выражения, определяемые пользователем

Located at the left of the editing area is a list box containing user defined regular expressions. Some regular expressions are pre-installed with your KDE installation, while others you can save yourself.

Данные регулярные выражения обеспечивают достижение двух целей: (см. более подробное описание), а именно: 1) Обеспечивают блоки для компоновки регулярных выражений 2) делают регулярные выражения более понятными.

Вы можете сохранить ваши собственные регулярные выражения, щёлкнув правой кнопкой мыши в области редактирования и выбрав пункт `Сохранить регулярное выражение` в появившемся меню.

If the regular expression you save is within a compound container then the regular expression will take part in making subsequent regular expressions prettier.

User defined regular expressions can be deleted or renamed by pressing the right mouse button on top of the regular expression in question in the list box.

## Как сообщить о пожеланиях и замеченных ошибках?

Bug reports and feature requests should be submitted through the KDE Bug Tracking System. Before you report a bug or suggest a feature, please check that it hasn't already been reported/suggested.

## Вопросы и ответы

### Поддерживает ли редактор регулярных выражений обратные ссылки?

В настоящий момент нет, но планируется к реализации в следующей версии.

### Будет ли в редакторе регулярных выражений предусмотрена возможность отображения совпадений?

Нет, но будем надеяться, что это будет реализовано в будущем.

### Я являюсь автором программы для KDE, как я могу использовать ваш редактор в своём приложении?

См. ссылку Документация для класса KRegExpEditorInterface

### Я не могу найти кнопку редактировать регулярные выражения, допустим, в konqueror, после переустановки KDE 3, почему?

Виджет для работы с регулярными выражениями содержится в пакете kdeutils. Если вы не установили этот пакет, то кнопка редактировать регулярные выражения не появится в соответствующих программах.

## Лицензия и благодарности

Документация (С) 2001, Jesper K. Pedersen blackie@kde.org

Перевод (С) 2002 Клютченя А.Л. asoneofus@kde.ru

Редакция перевода (С) 2004 Н. Шафоростов, linux@l10n.org.ua, http://program.net.ua.

&underGPL; &underFDL;