mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
615 lines
No EOL
35 KiB
HTML
615 lines
No EOL
35 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||
<html>
|
||
<head>
|
||
<title>Синтаксис регулярных выражений</title>
|
||
<link rel="STYLESHEET" type="text/css" href="doublecmd.css"/>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||
</head>
|
||
|
||
<body>
|
||
<div class="CHAPTER">
|
||
<h1>Синтаксис регулярных выражений</h1>
|
||
|
||
<div class="TOC">
|
||
<dl>
|
||
<dt class="bold">Содержание</dt>
|
||
<dt>1. <a a href="#preface">Введение</a></dt>
|
||
<dt>2. <a a href="#compare">Простое сравнение</a></dt>
|
||
<dt>3. <a a href="#esc">Escape-последовательности</a></dt>
|
||
<dt>4. <a a href="#symbols">Перечни символов</a></dt>
|
||
<dt>5. <a a href="#meta">Метасимволы</a></dt>
|
||
<dd>
|
||
<dl>
|
||
<dt>5.1. <a a href="#meta-line">Метасимволы - разделители строк</a></dt>
|
||
<dt>5.2. <a a href="#meta-std">Метасимволы - стандартные перечни символов</a></dt>
|
||
<dt>5.3. <a a href="#meta-words">Метасимволы - границы слов</a></dt>
|
||
<dt>5.4. <a a href="#meta-dup">Метасимволы - повторения</a></dt>
|
||
<dt>5.5. <a a href="#meta-vars">Метасимволы - варианты</a></dt>
|
||
<dt>5.6. <a a href="#meta-sub">Метасимволы - подвыражения</a></dt>
|
||
<dt>5.7. <a a href="#meta-back">Метасимволы - обратные ссылки</a></dt>
|
||
</dl>
|
||
</dd>
|
||
<dt>6. <a a href="#modifiers">Модификаторы</a></dt>
|
||
<dt>7. <a a href="#perl">Расширения Perl</a></dt>
|
||
</dl>
|
||
</div>
|
||
|
||
<hr/>
|
||
|
||
<p>Double Commander использует свободную Delphi-библиотеку TRegExpr Андрея В. Сорокина:
|
||
<a href="http://www.regexpstudio.com/">http://www.regexpstudio.com/</a>. Большинство из
|
||
приведённых далее объяснений и примеров позаимствовано из справочного файла к этой библиотеке.</p>
|
||
|
||
<div class="SECT1">
|
||
<h2><a name="preface">1. Введение</a></h2>
|
||
<p>Регулярные выражения — это широкоиспользуемый способ описания шаблонов для поиска
|
||
текста и проверки соответствия текста шаблону. Специальные <span class="bold">метасимволы</span>
|
||
позволяют определять, например, что Вы ищете подстроку в начале входной строки или определенное
|
||
число повторений подстроки.<p>
|
||
<p>Регулярные выражения предназначены главным образом для профессионалов, однако могут быть
|
||
полезны и при работе в офисе для поиска определённых документов (см. примеры ниже).</p>
|
||
<p>Double Commander поддерживает регулярные выражения в следующих функциях:</p>
|
||
<ul>
|
||
<li><p>Команды → Поиск файлов (в имени файла)</p></li>
|
||
<li><p>во встроенном редакторе</p></li>
|
||
<li><p>в инструменте группового переименования</p></li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="SECT1">
|
||
<h2><a name="compare">2. Простое сравнение</a></h2>
|
||
<p>Любой символ совпадает с самим собой, если он не относится к специальным метасимволам
|
||
описанным чуть ниже.</p>
|
||
<p>Последовательность символов совпадает с такой же последовательностью во входной строке,
|
||
так что шаблон "bluh" совпадет с подстрокой "bluh" во входной строке. Пока все просто, не так ли ?</p>
|
||
<p>Если необходимо, чтобы метасимволы или <span class="bold">escape-последовательности</span>
|
||
воспринимались как обычные символы, их нужно предварять символом "\", например, метасимвол "^"
|
||
обычно совпадает с началом строк, однако, если записать его как "\^", то он будет совпадать с
|
||
символом "^", "\\" совпадает с "\" и т.д.</p>
|
||
<p class="bold">Примеры:</p>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>foobar</tt></td>
|
||
<td>находит 'foobar'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\^FooBarPtr</tt></td>
|
||
<td>находит '^FooBarPtr'</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<div class="SECT1">
|
||
<h2><a name="esc">3. Escape-последовательности</a></h2>
|
||
<p>Любой символ может быть определен с помощью escape последовательности, так же как это
|
||
делается в языках C или Perl: "\n" означает начало строки, "\t" — табуляцию и т.д..
|
||
Вообще, \xnn, где nn это последовательность шестнадцатеричных цифр, означает символ с ASCII-кодом nn.
|
||
Если необходимо определить двухбайтный (Unicode) символ, используйте формат '\x{nnnn}',
|
||
где 'nnnn' — одна или более шестнадцатеричных цифр.</p>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>\xnn</tt></td>
|
||
<td>символ с шестнадцатеричным кодом nn</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\x{nnnn}</tt></td>
|
||
<td>символ с шестнадцатеричным кодом nnnn (более одного байта можно задавать только в режиме
|
||
<a href="http://www.regexpstudio.com/RU/TRegExpr/Help/tregexpr_interface.html#unicode_support">Unicode</a>)</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\t</tt></td>
|
||
<td>табуляция (HT/TAB), можно также \x09</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\n</tt></td>
|
||
<td>новая строка (NL), можно также \x0a</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\r</tt></td>
|
||
<td>возврат каретки (CR), можно также \x0d</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\f</tt></td>
|
||
<td>перевод формата (FF), можно также \x0c</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\a</tt></td>
|
||
<td>звонок (BEL), можно также \x07</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\e</tt></td>
|
||
<td>escape (ESC), можно также \x1b</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p class="bold">Примеры:</p>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>foo\x20bar</tt></td>
|
||
<td>находит 'foo bar' (обратите внимание на пробел посередине)</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\tfoobar</tt></td>
|
||
<td>находит 'foobar' предшествуемый табуляцией</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<div class="SECT1">
|
||
<h2><a name="symbols">4. Перечни символов</a></h2>
|
||
<p>Вы можете определить перечень, заключив символы в []. Перечень будет совпадать с любым
|
||
<span class="bold">одним</span> символом перечисленным в нем.</p>
|
||
<p>Если первый символ перечня (сразу после "[") - "^", то такой перечень совпадает с любым
|
||
символом <span class="bold">не</span> перечисленным в перечне.</p>
|
||
<p class="bold">Примеры:</p>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>foob[aeiou]r</tt></td>
|
||
<td>находит 'foobar', 'foober' и т.д. но не 'foobbr', 'foobcr' и т.д.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>foob[^aeiou]r</tt></td>
|
||
<td>находит 'foobbr', 'foobcr' и т.д.. но не 'foobar', 'foober' и т.д.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>Внутри перечня символ "-" может быть использован для определения <span class="bold">диапазонов</span>
|
||
символов, например a-z представляет все символы между "a" и "z", включительно.</p>
|
||
<p>Если Вам необходимо включить в перечень сам символ "-", поместите его в начало или конец
|
||
перечня или предварите '\'. Если Вам необходимо поместить в перечень сам символ ']', поместите
|
||
его в самое начало или предварите '\'.</p>
|
||
<p class="bold">Примеры:</p>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>[-az]</tt></td>
|
||
<td>'a', 'z' и '-'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>[az-]</tt></td>
|
||
<td>'a', 'z' и '-'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>[a\-z]</tt></td>
|
||
<td>'a', 'z' и '-'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>[a-z]</tt></td>
|
||
<td>все 26 малых латинских букв от 'a' до 'z'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>[\n-\x0D]</tt></td>
|
||
<td>#10, #11, #12, #13</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>[\d-t]</tt></td>
|
||
<td>цифра, '-' или 't'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>[]-a]</tt></td>
|
||
<td>символ из диапазона ']'..'a'</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<div class="SECT1">
|
||
<h2><a name="meta">5. Метасимволы</a></h2>
|
||
<p>Метасимволы — это специальные символы, являющиеся важнейшим понятием в регулярных
|
||
выражениях. Существует несколько групп метасимволов.</p>
|
||
</div>
|
||
|
||
<div class="SECT2">
|
||
<h3><a id="meta-line" name="meta-line">5.1. Метасимволы - разделители строк</a></h3>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>^</tt></td>
|
||
<td>начало строки</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>$</tt></td>
|
||
<td>конец строки</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\A</tt></td>
|
||
<td>начало текста</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\Z</tt></td>
|
||
<td>конец текста</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>.</tt></td>
|
||
<td>любой символ в строке</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p class="bold">Примеры:</p>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>^foobar</tt></td>
|
||
<td>находит 'foobar' только если он в начале строки</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>foobar$</tt></td>
|
||
<td>находит 'foobar' только если он в конце строки</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>^foobar$</tt></td>
|
||
<td>находит 'foobar' только если это единственное слово в строке</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>foob.r</tt></td>
|
||
<td>находит 'foobar', 'foobbr', 'foob1r' и т.д.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>Метасимвол "^" по умолчанию совпадает только в начале входного текста, а метасимвол "$" —
|
||
только в конце текста. Внутренние разделители строк, имеющиеся в тексте, не будут совпадать с
|
||
"^" и "$".</p>
|
||
<p>Однако, если Вам необходимо работать с текстом как с многострочным, чтобы "^" совпадал после
|
||
каждого разделителя строки внутри текста, а "$" — перед каждым разделителем, то Вы
|
||
можете включить <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/regexp_syntax.html#modifier_m">модификатор /m</a>.</p>
|
||
<p>Метасимволы \A и \Z аналогичны "^" и "$", но на них не действует <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/regexp_syntax.html#modifier_m">модификатор /m</a>,
|
||
т. е. они всегда совпадают только с началом и концом всего входного текста.</p>
|
||
<p>Метасимвол "." по умолчанию совпадает с любым символом, однако, если Вы выключите <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/regexp_syntax.html#modifier_s">модификатор /s</a>,
|
||
то '.' не будет совпадать с разделителями строк.</p>
|
||
<p>TRegExpr интерпретирует разделители строк так, как это рекомендовано на www.unicode.org
|
||
(http://www.unicode.org/unicode/reports/tr18/):</p>
|
||
<p>"^" совпадает с началом входного текста, а также, если включен <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/regexp_syntax.html#modifier_m">модификатор /m</a>,
|
||
с точкой непосредственно следующей после \x0D\x0A, \x0A или \x0D (если Вы используете <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/tregexpr_interface.html#unicode_support">Unicode-версию</a>
|
||
TRegExpr, то также \x2028 или \x2029 или \x0B или \x0C или \x85). Обратите внимание, что он не
|
||
совпадает в промежутке внутри последовательности \x0D\x0A.</p>
|
||
<p>"$" совпадает с концом входного текста, а также, если включен <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/regexp_syntax.html#modifier_m">модификатор /m</a>,
|
||
с точкой непосредственно предшествующей \x0D\x0A, \x0A или \x0D (если Вы используете <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/tregexpr_interface.html#unicode_support">Unicode-версию</a>
|
||
TRegExpr, то также \x2028 или \x2029 или \x0B или \x0C или \x85). Обратите внимание, что он не
|
||
совпадает в промежутке внутри последовательности \x0D\x0A.</p>
|
||
<p>"." совпадает с любым символом, но если выключен
|
||
<a href="http://www.regexpstudio.com/RU/TRegExpr/Help/regexp_syntax.html#modifier_s">модификатор /s</a>,
|
||
то "." не совпадает с \x0D\x0A и \x0A и \x0D (если Вы используете <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/tregexpr_interface.html#unicode_support">Unicode-версию</a>
|
||
TRegExpr, то не совпадает также с \x2028 и \x2029 и \x0B и \x0C и \x85).</p>
|
||
<p>Обратите внимание, что "^.*$" (шаблон для пустой строки) не совпадает с пустой строкой вида
|
||
\x0D\x0A, но совпадает с \x0A\x0D.</p>
|
||
<p>Вы можете перенастроить вышеописанное поведение при обработке многострочных текстов —
|
||
см. описания свойств <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/tregexpr_interface.html#lineseparators">LineSeparators</a>
|
||
и <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/tregexpr_interface.html#linepairedseparator">LinePairedSeparator</a>,
|
||
скажем, Вы можете перенастроиться на использование только Unix-разделителей строк \n или только
|
||
DOS/Windows-разделителей \r\n или же смешанных разделителей (так и настроено по умолчанию) или
|
||
вообще определить свои собственные разделители строк!</p>
|
||
</div>
|
||
|
||
<div class="SECT2">
|
||
<h3><a name="meta-std">5.2. Метасимволы - стандартные перечни символов</a></h3>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>\w</tt></td>
|
||
<td>буквенно-цифровой символ или "_"</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\W</tt></td>
|
||
<td>не \w</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\d</tt></td>
|
||
<td>цифровой символ</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\D</tt></td>
|
||
<td>не \d</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\s</tt></td>
|
||
<td>любой "пробельный" символ (по умолчанию — [\t\n\r\f])</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\S</tt></td>
|
||
<td>не \s</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>Стандартные перечни \w, \d и \s можно использовать и внутри <span class="bold">перечней символов</span>.</p>
|
||
<p class="bold">Примеры:</p>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>foob\dr</tt></td>
|
||
<td>находит 'foob1r', ''foob6r' и т.д. но не 'foobar', 'foobbr' и т.д.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>foob[\w\s]r</tt></td>
|
||
<td>находит 'foobar', 'foob r', 'foobbr' и т.д. но не 'foob1r', 'foob=r' и т.д.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>TRegExpr использует свойства
|
||
<a href="http://www.regexpstudio.com/RU/TRegExpr/Help/tregexpr_interface.html#tregexpr.spacechars">SpaceChars</a>
|
||
и <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/tregexpr_interface.html#tregexpr.wordchars">WordChars</a>
|
||
для того, чтобы определять стандартные перечни \w, \W, \s, \S, т.е. Вы легко можете переопределить
|
||
состав этих перечней.</p>
|
||
</div>
|
||
|
||
<div class="SECT2">
|
||
<h3><a name="meta-words">5.3. Метасимволы - границы слов</a></h3>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>\b</tt></td>
|
||
<td>совпадает на границе слова</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>\B</tt></td>
|
||
<td>совпадает не на границе слова </td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>Граница слова (\b) это точка между двумя символами, один из которых удовлетворяет \w, а
|
||
другой — \W (в любом порядке), при этом перед началом и после конца строки подразумевается \W.</p>
|
||
</div>
|
||
|
||
<div class="SECT2">
|
||
<h3><a name="meta-dup">5.4. Метасимволы - повторения</a></h3>
|
||
<p>После любого элемента регулярного выражения может следовать очень важный тип метасимвола —
|
||
повторитель. Используя их Вы можете определить число допустимых повторений предшествующего
|
||
символа, метасимвола или подвыражения.</p>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>*</tt></td>
|
||
<td>ноль или более раз ("жадный"), то же что {0,}</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>+</tt></td>
|
||
<td>один или более раз ("жадный"), то же что {1,}</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>?</tt></td>
|
||
<td>ноль или один раз ("жадный"), то же что {0,1}</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>{n}</tt></td>
|
||
<td>точно n раз ("жадный")</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>{n,}</tt></td>
|
||
<td>не менее n раз ("жадный")</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>{n,m}</tt></td>
|
||
<td>не менее n но не более m раз ("жадный")</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>*?</tt></td>
|
||
<td>ноль или более раз ("не жадный"), то же что {0,}?</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>+?</tt></td>
|
||
<td>один или более раз ("не жадный"), то же что {1,}?</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>??</tt></td>
|
||
<td>ноль или один раз ("не жадный"), то же что {0,1}?</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>{n}?</tt></td>
|
||
<td>точно n раз ("не жадный")</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>{n,}?</tt></td>
|
||
<td>не менее n раз ("не жадный")</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>{n,m}?</tt></td>
|
||
<td>не менее n но не более m раз ("не жадный") </td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>Т.о. {n,m} задает <span class="bold">минимум</span> n повторов и <span class="bold">максимум</span> —
|
||
m. Повторитель {n} эквивалентен {n,n} и задает точно n повторов. Повторитель {n,} задает
|
||
минимум n повторов. Теоретически величина параметров n и m не ограничена, но рекомендуется
|
||
не задавать большие значения, поскольку в некоторых ситуациях это может потребовать
|
||
существенных затрат времени и ОЗУ при обработке такого повторителя в связи с рекурсивным
|
||
характером работы.</p>
|
||
<p>Если фигурные скобки встречаются в "неправильном" месте, где они не могут быть восприняты
|
||
как повторитель, то они вопринимаются просто как символы</p>
|
||
<p class="bold">Примеры:</p>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>foob.*r</tt></td>
|
||
<td>находит 'foobar', 'foobalkjdflkj9r' и 'foobr'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>foob.+r</tt></td>
|
||
<td>находит 'foobar', 'foobalkjdflkj9r' но не 'foobr'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>foob.?r</tt></td>
|
||
<td>находит 'foobar', 'foobbr' и 'foobr' но не 'foobalkj9r'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>fooba{2}r</tt></td>
|
||
<td>находит 'foobaar'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>fooba{2,}r</tt></td>
|
||
<td>находит 'foobaar', 'foobaaar', 'foobaaaar' и т.д.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>fooba{2,3}r</tt></td>
|
||
<td>находит 'foobaar', или 'foobaaar' но не 'foobaaaar' </td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>Небольшое пояснение по поводу "жадности". "Жадные" варианты повторителей пытаются захватить
|
||
как можно большую часть входного текста, в то время как "не жадные" — как можно
|
||
меньшую. Например, 'b+' как и 'b*' примененные к входной строке 'abbbbc' найдут 'bbbb', в то
|
||
время как 'b+?' найдет только 'b', а 'b*?' — вообще — пустую строку;
|
||
'b{2,3}?' найдет 'bb', в то время как 'b{2,3}' найдет 'bbb'.</p>
|
||
<p>Вы можете переключить все повторители в выражении в "не жадный" режим, воспользовавшись
|
||
<a href="http://www.regexpstudio.com/RU/TRegExpr/Help/regexp_syntax.html#modifier_g">модификатором /g</a>.</p>
|
||
</div>
|
||
|
||
<div class="SECT2">
|
||
<h3><a name="meta-vars">5.5. Метасимволы - варианты</a></h3>
|
||
<p>Вы можете определить перечень <span class="bold">вариантов</span>, используя метасимвол "|"
|
||
для их разделения, например "fee|fie|foe" найдет "fee" или "fie" или "foe", (так же как "f(e|i|o)e").
|
||
В качестве первого варианта воспринимается все от предыдущего метасимвола "(" или "[" или от
|
||
начала выражения до первого метасимвола "|", в качестве последнего — все от
|
||
последнего "|" до конца выражения или до ближайшего метасимвола ")". Обычно, чтобы не запутаться,
|
||
набор вариантов всегда заключают в скобки, даже если без этого можно было бы обойтись.</p>
|
||
<p>Варианты пробуются начиная с первого и попытки завершаются сразу же как удастся подобрать
|
||
такой при котором совпадет вся последующая часть выражения (подробнее см. <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/regexp_syntax.html#mechanism">Механизм работы</a>).
|
||
Это означает, что варианты не обязательно обеспечат "жадное" поведение. Например, если применить
|
||
выражение "foo|foot" ко входной строке "barefoot", то будет найдено "foo" так это первый вариант
|
||
который позволил совпасть всему выражению.</p>
|
||
<p>Обратите внимание, что метасимвол "|" воспринимается как обычный символ внутри перечней
|
||
символов, например, [fee|fie|foe] означает ровно то же самое что и [feio|].</p>
|
||
<p class="bold">Примеры:</p>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>foo(bar|foo)</tt></td>
|
||
<td>находит 'foobar' или 'foofoo'</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<div class="SECT2">
|
||
<h3><a name="meta-sub">5.6. Метасимволы - подвыражения</a></h3>
|
||
<p>Метасимволы ( ... ) могут также использоваться для задания подвыражений — по
|
||
завершении поиска выражения Вы можете обратиться к любому подвыражению используя свойства
|
||
MatchPos, MatchLen и <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/tregexpr_interface.html#tregexpr.match">Match</a>,
|
||
а также подставлять подвыражения в некий шаблон, используя метод
|
||
<a href="http://www.regexpstudio.com/RU/TRegExpr/Help/tregexpr_interface.html#tregexpr.substitute">Substitute</a>).</p>
|
||
<p>Подвыражения нумеруются слева направо, в порядке появления открывающих скобок.</p>
|
||
<p>Первое подвыражение имеет номер '1' (выражение в целом — '0', к нему можно
|
||
обращаться в <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/tregexpr_interface.html#tregexpr.substitute">Substitute</a>
|
||
как '$0' так и '$&').</p>
|
||
<p class="bold">Примеры:</p>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>(foobar){8,10}</tt></td>
|
||
<td>находит строку содержащую 8, 9 или 10 копий 'foobar'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>foob([0-9]|a+)r</tt></td>
|
||
<td>находит 'foob0r', 'foob1r' , 'foobar', 'foobaar', 'foobaar' и т.д.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<div class="SECT2">
|
||
<h3><a name="meta-back">5.7. Метасимволы - обратные ссылки</a></h3>
|
||
<p>Метасимволы от \1 до \9 воспринимаются как обратные ссылки. \<n> совпадает с ранее
|
||
найденным подвыражением #<n>.</p>
|
||
<p class="bold">Примеры:</p>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>(.)\1+</tt></td>
|
||
<td>находит 'aaaa' и 'cc'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>(.+)\1+</tt></td>
|
||
<td>также находит 'abab' и '123123'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>(['"]?)(\d+)\1</tt></td>
|
||
<td>находит "13" (в дв. кавычках), или '4' (в один. кавычках) или 77 (без кавычек) и т.д.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<div class="SECT1">
|
||
<h2><a name="modifiers">6. Модификаторы</a></h2>
|
||
<p>Модификаторы служат для изменения режимов работы регулярных выражений.</p>
|
||
<p>Любой модификатор может меняться с помощью специальной конструкции
|
||
<a href="http://www.regexpstudio.com/RU/TRegExpr/Help/regexp_syntax.html#inline_modifiers">(?...)</a>
|
||
внутри регулярного выражения.</p>
|
||
<dl>
|
||
<dt><tt>i</tt></dt>
|
||
<dd>регистро-независимый режим (по умолчанию использует выбранный в ОС язык по умолчанию),
|
||
(см. также <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/tregexpr_interface.html#invertcase">InvertCase</a>)</dd>
|
||
<dt><tt>m</tt></dt>
|
||
<dd>воспринимать входной текст как многострочный, при этом метасимволы "^" и "$" будут совпадать
|
||
не только в начале и конце текста в целом, но и в начале и в конце всех имеющихся в тексте
|
||
строк (см. также <a href="http://www.regexpstudio.com/RU/TRegExpr/Help/regexp_syntax.html#syntax_line_separators">Разделители
|
||
строк</a>)</dd>
|
||
<dt><tt>s</tt></dt>
|
||
<dd>воспринимать входной текст как одну строку. При этом метасимвол "." совпадает с любым
|
||
символом, если же этот модификатор выключен, то он не совпадает с разделителями строк (см.также
|
||
<a href="http://www.regexpstudio.com/RU/TRegExpr/Help/regexp_syntax.html#syntax_line_separators">Разделители
|
||
строк</a>)</dd>
|
||
<dt><tt>g</tt></dt>
|
||
<dd>не стандартный модификатор. Выключая его Вы переключаете все повторители в "не жадный"
|
||
режим (по умолчанию этот модификатор включен). Т.е. если его отключить, то все '+' работают
|
||
как '+?', '*' как '*?' и т.д.</dd>
|
||
<dt><tt>x</tt></dt>
|
||
<dd>позволяет форматировать шаблон чтобы обеспечить более легкую читаемость (см. описание ниже)</dd>
|
||
<dt><tt>r</tt></dt>
|
||
<dd>не стандартный модификатор. Если включен, то диапазоны вида 'а-я' включают также букву
|
||
'ё', 'А-Я' включают 'Ё', а 'а-Я' включает вообще все русские буквы</dd>
|
||
</dl>
|
||
<p><a href="http://www.regexpstudio.com/RU/TRegExpr/Help/regexp_syntax.html#modifier_x">Модификатор
|
||
/x</a> заставляет игнорировать пробелы, табуляции и разделители строк, что позволяет
|
||
форматировать текст выражения. Кроме того, если встречается символ #, то все последующие
|
||
символы до конца строки воспринимаются как комментарий, например:</p>
|
||
<pre class="CODE">
|
||
(
|
||
(abc) # Комментарий 1
|
||
| # Пробелы внутри выражения также игнорируются
|
||
(efg) # Комментарий 2
|
||
)</pre>
|
||
<p>Естественно, это означает что, если Вам нужно вставить в выражение пробел, табуляцию или
|
||
разделитель строки или #, то в расширенном (/x) режиме это можно сделать только предваряя их
|
||
'/' или используя /xnn (внутри перечней символов все эти символы воспринимаются как обычно).</p>
|
||
</div>
|
||
|
||
<div class="SECT1">
|
||
<h2><a name="perl">7. Расширения Perl</a></h2>
|
||
<p class="bold">(?imsxr-imsxr)</p>
|
||
<p>Позволяет изменять значения модификаторов</p>
|
||
<p class="bold">Примеры:</p>
|
||
<table border="0" frame="void" width="100%" class="CALSTABLE">
|
||
<tbody>
|
||
<tr>
|
||
<td><tt>(?i)Saint-Petersburg</tt></td>
|
||
<td>находит 'Saint-petersburg' и 'Saint-Petersburg'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>(?i)Saint-(?-i)Petersburg</tt></td>
|
||
<td>находит 'Saint-Petersburg' но не 'Saint-petersburg'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>(?i)(Saint-)?Petersburg</tt></td>
|
||
<td>находит 'Saint-petersburg' и 'saint-petersburg'</td>
|
||
</tr>
|
||
<tr>
|
||
<td><tt>((?i)Saint-)?Petersburg</tt></td>
|
||
<td>находит 'saint-Petersburg', но не 'saint-petersburg' </td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p class="bold">(?#text)</p>
|
||
<p>Комментарий, просто игнорируется. Обратите внимание, что в комментарии такого вида
|
||
невозможно поместить символ ")", поскольку он воспринимается как конец комментария.</p>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</body>
|
||
|
||
</html> |