<?xml version="1.0" ?> <!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [ <!ENTITY % Russian "INCLUDE"> <!ENTITY % addindex "IGNORE"> ]> <book lang="&language;"> <bookinfo> <title >Редактор регулярных выражений</title> <authorgroup> <author ><firstname >Jesper K.</firstname > <surname >Pedersen</surname > <affiliation ><address ><email >blackie@kde.org</email ></address ></affiliation> </author> </authorgroup> <date >2001-07-03</date> <releaseinfo >0.1</releaseinfo> <legalnotice >&underFDL;</legalnotice> <copyright> <year >2001</year> <holder >Jesper K. Pedersen</holder> </copyright> <abstract> <para >Это руководство описывает виджет встроенного редактора регулярных выражений.</para> </abstract> <keywordset> <keyword >KDE</keyword> <keyword >регулярное выражение</keyword> </keywordset> </bookinfo> <!-- ====================================================================== --> <!-- Introduction --> <!-- ====================================================================== --> <chapter id="introduction"> <title >Введение</title> <para >Редактор регулярных выражений предназначен для редактирования регулярных выражений в графическом виде (в отличие от текстовых строк). Традиционно, регулярные выражения имеют ASCII синтаксис, к примеру: <literal >^.*kde\b</literal >. Основными недостатками данного стиля являются: <itemizedlist> <listitem ><para >Сложность применения для людей, не занимающихся программированием.</para ></listitem> <listitem ><para >Необходимость <emphasis >экранировать</emphasis > определённые символы (например, чтобы использовать символ звёздочки, придётся набрать <literal >\*</literal >). </para ></listitem> <listitem ><para >Необходимость постоянно помнить и соблюдать правила приоритетов выполнения - что делает операция <literal >x|y*</literal >? Значение <literal >x</literal > или множество <literal >y</literal >, <emphasis >ИЛИ</emphasis > множества <literal >x</literal > и <literal >y</literal > смешаны?</para ></listitem> </itemizedlist> </para> <para >The regular expression editor, on the other hand, lets you <emphasis >draw</emphasis > 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 <ulink url="mailto:blackie@kde.org" >let me know</ulink >. </para> </chapter> <!-- ====================================================================== --> <!-- What is a Regular Expression --> <!-- ====================================================================== --> <chapter id="whatIsARegExp"> <title >Что такое регулярное выражение?</title> <para >A regular expression is a way to specify <emphasis >conditions</emphasis > to be fulfilled for a situation in mind. Normally when you search in a text editor you specify the text to search for <emphasis >literally</emphasis >, using a regular expression, on the other hand, you tell what a given match would look like. Examples of this include <emphasis >I'm searching for the word KDE, but only at the beginning of the line</emphasis >, or <emphasis >I'm searching for the word <literal >the</literal >, but it must stand on its own</emphasis >, or <emphasis >I'm searching for files starting with the word <literal >test</literal >, followed by a number of digits, for example <literal >test12</literal >, <literal >test107</literal > and <literal >test007</literal ></emphasis ></para> <para >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.</para> <example> <title >Поиск обычного текста</title> <para >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: <literal >.*|$</literal >. Thus if you want to search for the text <literal >kde.</literal > (i.e. the characters <literal >kde</literal > followed by a period), then you would need to specify this as <literal >kde\.</literal ><footnote ><para >The regular expression editor solves this problem by taking care of escape rules for you.</para ></footnote > Writing <literal >\.</literal > rather than just <literal >.</literal > is called <emphasis >escaping</emphasis >. </para> </example> <example id="positionregexp"> <title >Matching URLs</title> <para >Когда вы выбираете нечто похожее на URL в KDE, то программа <command >klipper</command > предложить вам открыть этот URL при помощи <command >konqueror</command >.</para> <para ><command >Klipper</command > осуществляет свой выбор, руководствуясь результатами сопоставления нескольких регулярных выражений, и когда одно из регулярных выражений совпадает с искомым, тогда и будет предложен подходящий вариант.</para> <para >Регулярное выражение для URL содержит (помимо всего прочего) условие, что текст должен начинаться с <literal >http://</literal >. С помощью регулярного выражения это условие можно описать следующим образом: <literal >http://</literal > со шляпой (с символом <literal >^</literal >).</para> <para >Предыдущий пример показывает, как с помощью регулярных выражений можно указать расположение искомого фрагмента в тексте (совпадение позиции). Аналогично можно указать на то, что искомый фрагмент находится <emphasis >в конце строки </emphasis >, для этого используется символ <literal >$</literal > (символ доллара).</para> </example> <example id="boundaryregexp"> <title >Поиск слова <literal >the</literal >, но не <emphasis >the</emphasis ><literal >re</literal >, <literal >brea</literal ><emphasis >the</emphasis > или <literal >ano</literal ><emphasis >the</emphasis ><literal >r</literal ></title> <para >По образу и подобию вышеизложенного могут быть указаны ещё два дополнительных условия при поиске, а именно: позиция <emphasis >на границе слова</emphasis > (в начале, либо конце) и <emphasis >не на границе слова</emphasis >. Для обозначения этих условий применяются обозначения <literal >\b</literal > (указание на границу слова) и <literal >\B</literal > (не на границе слова). <emphasis ></emphasis ></para> <para >Таким образом слово <literal >the</literal > можно найти, воспользовавшись регулярным выражением <literal >\bthe\b</literal >. Этим мы указываем, что ищем просто слово <literal >the</literal > без каких-бы то ни было довесков перед и после слова (т.е с границами по каждой из сторон слова) </para> <para >Все четыре типа указания на расположение, использующиеся в регулярных выражениях, включены в редактор, см. <link linkend="positiontool" > четыре различных типа расположения</link ></para> </example> <example id="altnregexp"> <title >Поиск всех <literal >this</literal > или <literal >that</literal ></title> <para >Представьте себе, что вы хотите найти в документе слово <literal >this</literal > или слово <literal >that</literal >. При обычном поиске вам необходимо сделать два прохода: в первый произвести поиск слова <literal >this</literal >, во второй - <literal >that</literal >.</para> <para >Используя регулярные выражения, вы можете сделать всё это за один приём. Для этого запишите выражение следующим образом: <literal >this|that</literal >, т.е. разделите оба искомых слова вертикальной чертой. <footnote ><para >Обратите внимание, что по обе стороны от вертикальной черты могут находиться не только искомые слова, но и два регулярных выражения.</para ></footnote ></para> <para >In the regular expression editor you do not write the vertical bar yourself, but instead select the <link linkend="altntool" >alternative tool</link >, and insert the smaller regular expressions above each other.</para> </example> <example id="repeatregexp"> <title >Совпадение с произвольным условием</title> <para >Регулярные выражения часто сравнивают с шаблоном, использующемся в командном интерпретаторе (оболочке), где можно выбрать несколько файлов, используя звёздочку. Вы без всякого сомнения узнаете шаблон в следующих примерах: <itemizedlist> <listitem ><para ><literal >ls *.txt</literal > - here <literal >*.txt</literal > is the shell wildcard matching every file ending with the <literal >.txt</literal > extension.</para ></listitem> <listitem ><para ><literal >cat test??.res</literal > - вывод всех файлов, начинающихся с <literal >test</literal >, за которым следуют два любых символа, и заканчивающихся на <literal >.res</literal >.</para ></listitem> </itemizedlist> </para> <para >В оболочке звёздочка указывает, что любой символ может встретиться в названии любое количество раз, другими словами, звёздочка означает <emphasis >всё, что угодно</emphasis >. В регулярном выражении подобное условие задаётся при помощи записи <literal >.*</literal >. Точка указывает, что может быть <emphasis > один</emphasis > произвольный символ, в свою очередь звёздочка сообщает, что предыдущее регулярное выражение может соответствовать любое количество раз. Вместе они задают условие поиска: любой единичный символ может быть встречен произвольное количество раз.</para> <para >Это может на первый взгляд показаться чрезмерно сложным, но когда вы увидите всю картину работы регулярных выражений,то сможете по достоинству оценить всё их изящество. Позвольте продемонстрировать ещё одно основное выражение: <literal >a</literal >. Эта запись указывает, что регулярное выражение ищет соответствие одиночному символу <literal >a</literal >. Если объединить эту запись со звёздочкой, т.е. <literal >a*</literal >, то получится регулярное выражение допускающее любое количество символов a.</para> <para >Можно объединять несколько регулярных выражений последовательно, например <literal >ba(na)*</literal >. Запись <footnote ><para ><literal >(na)*</literal > указывает, что строка в скобках может повторяться любое количество раз</para ></footnote >. Представьте себе, что работая в текстовом редакторе, вы должны найти следующие слова: <literal >ba</literal >, <literal >bana</literal >, <literal >banana</literal >, <literal >bananananananana</literal > </para> <para >Как сказано выше, не составляет труда записать шаблон оболочки: <literal >test??.res</literal > через регулярное выражение: <literal >test..\.res</literal >. Вообще-то точка означает любой символ. Для того чтобы указать что нужна именно точка, вы должны записать <literal >\.</literal ><footnote ><para > Здесь использована управляющая последовательность</para ></footnote >. Во всех словах регулярное выражение <literal >\.</literal > означает точка, а просто точка - соответствие любому символу в данной позиции. </para> <para >In the regular expression editor, a repeated regular expression is created using the <link linkend="repeattool" >repeat tool</link > </para> </example> <example id="lookaheadregexp"> <title >Replacing <literal >&</literal > with <literal >&amp;</literal > in a HTML document</title > <para >В документе HTML, для того чтобы отображался специальный символ <literal >&</literal >, его необходимо записать как <literal >&amp;</literal > - по аналогии с тем, как происходит замена служебных символов на управляющие последовательности в регулярных выражениях.</para> <para >Представьте себе, что вы набрали документ HTML в обычном текстовом редакторе (XEmacs, Kate или Notepad), и полностью забыли про эти правила. Для того чтобы устранить ошибку, необходимо заменить все записи <literal >&</literal > на <literal >&amp;</literal >.</para> <para >This can easily be done using normal search and replace, there is, however, one glitch. Imagine that you did remember this rule - <emphasis >just a bit</emphasis > - and did it right in some places. Replacing unconditionally would result in <literal >&amp;</literal > being replaced with <literal >&amp;amp;</literal ></para> <para >На самом деле вы хотите произвести замену записи <literal >&</literal > только в том случае, если за ней <emphasis >не</emphasis > стоит <literal >amp;</literal >. Для этого вы должны воспользоваться регулярными выражениями, использующими <emphasis >запрещения</emphasis >. </para> <para >Для того чтобы выполнить условие, при котором за искомым не должно стоять <literal >amp;</literal >, необходимо записать следующее выражение: <literal >&(?!amp;)</literal >. Гораздо проще всё будет выглядеть в редакторе регулярных выражений, если вы воспользуетесь <link linkend="lookaheadtools" > инструментами запрета/расширения</link >.</para> </example> </chapter> <!-- ====================================================================== --> <!-- Using the Regular Expression Editor --> <!-- ====================================================================== --> <chapter id="theEditor"> <title >Работа с редактором регулярных выражений</title> <para >В этой главе рассказывается о работе непосредственно с редактором регулярных выражений </para> <!-- ====================================================================== --> <!-- The organization of the screen --> <!-- ====================================================================== --> <sect1 id="screenorganization"> <title >Организация рабочего окна</title> <mediaobject> <imageobject ><imagedata format="PNG" fileref="theEditor.png"/></imageobject> </mediaobject> <para >Наиболее важной частью редактора является область редактирования, это область, в который вы рисуете регулярные выражения. Область имеет серый цвет и расположена в центре рабочего окна.</para> <para >Выше области редактирования расположены две панели инструментов. Первая панель содержит <link linkend="editingtools" >средства редактирования</link > и очень похожа на инструменты для рисования в графических программах. Вторая панель содержит кнопку <emphasis >Что это?</emphasis > и кнопки отмены и повтора.</para> <para ></para> <para >Ниже области редактирования находится строка регулярного выражения в текстовом (ASCII) виде. Все изменения, вносимые в графическом редакторе переносятся в текстовую форму. Если вы захотите поправить регулярное выражение в текстовом виде, то все изменения также будут внесены в графическое представление.</para> <para >Наконец, слева от области редактирования есть много заготовок регулярных выражений. Они служат для достижения двух целей: (1) Когда вы используете редактор, эти выражения являются более <emphasis >качественными</emphasis > или, если хотите, более исчерпывающими, заменяя общие регулярные выражения. На рисунке выше вы можете увидеть, как текстовое представление ".*" заменяется на шаблонное "всё что угодно".(2) Вы можете использовать эти заготовки в качестве строительного материала для построения своих регулярных выражений. За более исчерпывающей информацией обратитесь к разделу <link linkend="userdefinedregexps" >регулярные выражения, определяемые пользователями</link >, где содержится подробная информация о том, как сохранить ваши собственные регулярные выражения.</para > </sect1> <!-- ====================================================================== --> <!-- Editing Tools --> <!-- ====================================================================== --> <sect1 id="editingtools"> <title >Средства редактирования</title> <para >В этой главе предполагается, что вы изучили главу <link linkend="whatIsARegExp" >что такое регулярные выражения</link > и имеете представление, о чём идёт речь.</para> <para >Все инструменты расположены на панели инструментов, выше области редактирования. Далее будет описан каждый из инструментов.</para> <simplesect id="selecttool"> <title >Выделение <inlinemediaobject > <imageobject ><imagedata format="PNG" fileref="select.png"/> </imageobject ></inlinemediaobject ></title> <para >Выделение предназначено для обозначения элементов, подлежащих вырезке - вставке или перетаскиванию. Выделение работает также как и в обычных программах для работы с графикой.</para> </simplesect> <simplesect id="texttool" ><title >Текст <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="text.png"/> </imageobject ></inlinemediaobject ></title> <para ><inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="texttool.png"/> </imageobject ></inlinemediaobject ></para> <para >Используя этот инструмент вы можете вставить обычный текст, при этом не заботясь о наличии и необходимости замены специальных символов. Далее в примере будет создано регулярное выражение: <literal >abc\*\\\)</literal ></para> </simplesect> <simplesect id="characterstool" ><title >Символ <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="characters.png"/> </imageobject ></inlinemediaobject ></title> <para ><inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="charactertool.png"/> </imageobject ></inlinemediaobject ></para> <para >Используя этот инструмент, вы определяете области значений символьных величин. К примеру, что в тексте содержатся символы <literal >[0-9]</literal >, <literal >[^a-zA-Z,_]</literal >. Если вы воспользовались данным инструментом, то должен появиться диалог, в котором определяются области значений символьных величин.</para> <para >См. также <link linkend="repeatregexp" >повторение регулярных выражений</link >.</para> </simplesect> <simplesect id="anychartool" ><title >Любой символ <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="anychar.png"/> </imageobject ></inlinemediaobject ></title> <para ><inlinemediaobject ><imageobject ><imagedata format="PNG" fileref="anychartool.png"/> </imageobject ></inlinemediaobject ></para> <para >Регулярное выражение "точка" (.). Точка соответствует любому одиночному символу.</para > </simplesect> <simplesect id="repeattool" ><title >Повторение <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="repeat.png"/> </imageobject ></inlinemediaobject ></title> <para ><inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="repeattool.png"/> </imageobject ></inlinemediaobject ></para> <para >Повторяющиеся элементы. Включают в себя звёздочку (*), плюс (+), знак вопроса (?) и интервал ({3,5}). Если вы используете этот инструмент, то появится диалог, в котором вы должны указать необходимое количество повторов.</para> <para >Вы определяете, что требуется повторять, рисуя его внутри квадратика, который появляется при использовании данного инструмента.</para> <para >Повторяемые элементы выражения можно взять извне, затем поместить в квадрат. Также вы можете сперва нарисовать то что потом должно будет быть повторено, а затем выбрать инструмент повторения. И наоборот: вы можете сперва вставить повторитель, а затем нарисовать внутри него повторяемое. </para> <para >См. <link linkend="repeatregexp" >повторяемые регулярные выражения</link >.</para> </simplesect> <simplesect id="altntool" ><title >Варианты <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="altn.png"/> </imageobject ></inlinemediaobject ></title> <para ><inlinemediaobject ><imageobject ><imagedata format="PNG" fileref="altntool.png"/> </imageobject ></inlinemediaobject ></para> <para >Задание альтернативы - это использование оператора(|). Вы рисуете другой вариант поверх имеющегося, после того как в редакторе появится новый квадратик для ввода.</para> <para >См. раздел <link linkend="altnregexp" >альтернативные регулярные выражения</link ></para> </simplesect> <simplesect id="compoundtool" ><title >Составное выражение <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="compound.png"/> </imageobject ></inlinemediaobject ></title> <para ><inlinemediaobject ><imageobject ><imagedata format="PNG" fileref="compoundtool.png"/> </imageobject ></inlinemediaobject ></para> <para >Это - не регулярное выражение. Оно позволяет группировать составляющие для того, чтобы вы могли их легко использовать, руководствуясь только названиями. Это видно в правой части рисунка.</para> </simplesect> <simplesect id="positiontool" ><title >Начало/конец строки <inlinemediaobject ><imageobject > <imagedata format="PNG" fileref="begline.png"/> </imageobject ></inlinemediaobject > <inlinemediaobject ><imageobject> <imagedata format="PNG" fileref="endline.png"/> </imageobject ></inlinemediaobject ></title> <para ><inlinemediaobject ><imageobject ><imagedata format="PNG" fileref="linestartendtool.png"/> </imageobject ></inlinemediaobject ></para> <para >Инструменты начала и конца строк указывают на соответствие условиям начала и конца строки. Регулярное выражение в приведённом выше примере рабочего окна редактора не содержит символов соответствия начала/конца строк.</para> <para >См. <link linkend="positionregexp" >сопоставление позиций в регулярных выражениях</link >.</para> </simplesect> <simplesect ><title >(Не)граница слова <inlinemediaobject ><imageobject > <imagedata format="PNG" fileref="wordboundary.png"/> </imageobject ></inlinemediaobject > <inlinemediaobject ><imageobject ><imagedata format="PNG" fileref="nonwordboundary.png"/> </imageobject ></inlinemediaobject ></title> <para ><inlinemediaobject ><imageobject ><imagedata format="PNG" fileref="boundarytools.png"/> </imageobject ></inlinemediaobject ></para> <para >Инструментальные средства границ позволяют задавать условия соответствие границам или содержимому слова. Регулярное выражение, изображённое на рисунке, совпадает с любыми словами, начинающимися с <literal >the</literal >. Само слово <literal >the</literal > не совпадает с этим условием.</para> <para >См. описание в разделе <link linkend="boundaryregexp" >границы в регулярных выражениях</link >.</para> </simplesect> <simplesect id="lookaheadtools" ><title >Упреждающий поиск (по отрицанию) <inlinemediaobject ><imageobject > <imagedata format="PNG" fileref="poslookahead.png"/> </imageobject ></inlinemediaobject > <inlinemediaobject ><imageobject > <imagedata format="PNG" fileref="neglookahead.png"/> </imageobject ></inlinemediaobject ></title> <para ><inlinemediaobject ><imageobject > <imagedata format="PNG" fileref="lookaheadtools.png"/> </imageobject ></inlinemediaobject ></para> <para >Инструментальные средства условий разрешения/блокировки определяют будут ли приняты результаты по конкретному условию. Частное решение, тем не менее, не является частью общего.</para> <para >Note: You are only allowed to place lookaheads at the end of the regular expressions. The Regular Expression Editor widget does not enforce this.</para> <para >См. описание в разделе <link linkend="lookaheadregexp" >блокировки и разрешения в регулярных выражениях</link >.</para> </simplesect> </sect1> <!-- ====================================================================== --> <!-- User Defined Regular Expressions --> <!-- ====================================================================== --> <sect1 id="userdefinedregexps"> <title >Регулярные выражения, определяемые пользователем</title> <para >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.</para > <para >Данные регулярные выражения обеспечивают достижение двух целей: (см. <link linkend="screenorganization" >более подробное описание</link >), а именно: 1) Обеспечивают блоки для компоновки регулярных выражений 2) делают регулярные выражения более понятными.</para> <para >Вы можете сохранить ваши собственные регулярные выражения, щёлкнув правой кнопкой мыши в области редактирования и выбрав пункт <literal >Сохранить регулярное выражение</literal > в появившемся меню.</para> <para >If the regular expression you save is within a <link linkend="compoundtool" >compound container</link > then the regular expression will take part in making subsequent regular expressions prettier.</para> <para >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.</para> </sect1> </chapter> <!-- ====================================================================== --> <!-- Reporting a bug and Suggesting Features --> <!-- ====================================================================== --> <chapter id="bugreport"> <title >Как сообщить о пожеланиях и замеченных ошибках?</title> <para >Bug reports and feature requests should be submitted through the <ulink url="http://bugs.kde.org/" >KDE Bug Tracking System</ulink >. <emphasis role="strong" >Before</emphasis > you report a bug or suggest a feature, please check that it hasn't already been <ulink url="http://bugs.kde.org/simple_search.cgi?id=kregexpeditor" >reported/suggested.</ulink ></para> </chapter> <!-- ====================================================================== --> <!-- FAQ --> <!-- ====================================================================== --> <chapter id="faq"> <title >Вопросы и ответы</title> <sect1 id="question1"> <title >Поддерживает ли редактор регулярных выражений обратные ссылки?</title> <para >В настоящий момент нет, но планируется к реализации в следующей версии.</para> </sect1> <sect1 id="question2"> <title >Будет ли в редакторе регулярных выражений предусмотрена возможность отображения совпадений?</title> <para >Нет, но будем надеяться, что это будет реализовано в будущем.</para> </sect1> <sect1 id="question3"> <title >Я являюсь автором программы для KDE, как я могу использовать ваш редактор в своём приложении?</title> <para >См. ссылку <ulink url="http://developer.kde.org/documentation/library/cvs-api/classref/interfaces/KRegExpEditorInterface.html" >Документация для класса KRegExpEditorInterface</ulink ></para> </sect1> <sect1 id="question4"> <title >Я не могу найти кнопку <emphasis >редактировать регулярные выражения</emphasis >, допустим, в konqueror, после переустановки KDE 3, почему?</title> <para >Виджет для работы с регулярными выражениями содержится в пакете kdeutils. Если вы не установили этот пакет, то кнопка <emphasis >редактировать регулярные выражения </emphasis >не появится в соответствующих программах.</para> </sect1> </chapter> <!-- ====================================================================== --> <!-- Credits and Licenses --> <!-- ====================================================================== --> <chapter id="credits-and-license"> <title >Лицензия и благодарности</title> <para >Документация (С) 2001, Jesper K. Pedersen <email >blackie@kde.org</email > </para ><para >Перевод (С) 2002 Клютченя А.Л. <email >asoneofus@kde.ru</email ></para ><para >Редакция перевода (С) 2004 Н. Шафоростов, <email >linux@l10n.org.ua</email >, <ulink url="http://program.net.ua" >http://program.net.ua</ulink >. </para> &underGPL; &underFDL; </chapter> </book> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-namecase-general:t sgml-general-insert-case:lower sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:2 sgml-indent-data:t sgml-parent-document:nil sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: -->