2018-02-05 17:22:04 +03:00
|
|
|
|
<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>regexp</title>
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
<body>
|
|
|
|
|
<h1>regexp</h1>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Сравнивает строку и регулярное выражение.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>СИНТАКСИС</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
<strong>regexp</strong> ?<em>switches</em>? <em>exp</em> <em>string</em> ?<em>matchVar</em>? ?<em>subMatchVar</em> <em>subMatchVar</em>...?
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2>ОПИСАНИЕ</h2>
|
|
|
|
|
|
|
|
|
|
<p>Команда определяет, соответствует ли регулярное
|
|
|
|
|
выражение<em>exp</em> какой-либо части строки <em>string</em> или
|
|
|
|
|
всей строке, и возвращает <strong>1</strong>, если соответствует, и
|
|
|
|
|
<strong>0</strong> - в противном случае.</p>
|
|
|
|
|
|
|
|
|
|
<p>Если в команде указаны дополнительные аргументы после
|
|
|
|
|
<em>string</em>, они считаются именами переменных, в которые
|
|
|
|
|
возвращается информация о том, какие именно части строки
|
|
|
|
|
соответствуют регулярным выражениям. Переменной присваивается
|
|
|
|
|
значение, состоящее из части строки, соответствующей всему
|
|
|
|
|
регулярному выражению. Самой левой в списке переменной
|
|
|
|
|
<em>subMatchVar</em> присваивается значение, состоящее из части
|
|
|
|
|
строки, которая соответствует самому левому заключенному в
|
|
|
|
|
скобки выражению в составе <em>exp</em>. Следующей переменной
|
|
|
|
|
subMatchVar присваивается значение, соответствующее следующему
|
|
|
|
|
заключенному в скобки выражению, и так далее.</p>
|
|
|
|
|
|
|
|
|
|
<p>Если первые аргументы команды начинаются с <strong>-</strong>, они
|
|
|
|
|
считаются опциями команды. Ниже перечислены возможные опции.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dl>
|
|
|
|
|
<dt><strong>-nocase</strong></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>При сравнении не различает буквы в верхнем и нижнем
|
|
|
|
|
регистре.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dt><strong>-indices</strong></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>В переменных <em>subMatchVars</em> сохраняются не части
|
|
|
|
|
строки, а списки из двух десятичных чисел - индексов начала и
|
|
|
|
|
конца соответствующей области строки.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dt><strong>--</strong></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Означает конец опций. следующий аргумент будет
|
|
|
|
|
рассматриваться как <em>exp</em>, даже если он начинается с
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<strong>-</strong>.</dd>
|
|
|
|
|
</dl>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Если в команде указано больше переменных <em>subMatchVar</em>,
|
|
|
|
|
чем выражений в скобках в <em>exp</em>, или если для одного из
|
|
|
|
|
выражений не удалось найти соответствующую ему часть строки, то
|
|
|
|
|
соответствующей переменной будет присвоено значение <strong>-1</strong>
|
|
|
|
|
или пустая строка, в зависимости от того, была ли задана опция
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<strong>-indices</strong>.</p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2><a name=РЕГУЛЯРНЫЕ></a>РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ</h2>
|
|
|
|
|
|
|
|
|
|
<p>Регулярное выражение состоит из ни одной или более
|
|
|
|
|
<em>ветвей</em> (branch), разделенных символом '<strong>|</strong>'. Строка
|
|
|
|
|
соответствует выражению, если она соответствует одной из его
|
|
|
|
|
ветвей.</p>
|
|
|
|
|
|
|
|
|
|
<p>Ветвь состоит из одной или более <em>частей</em> (piece),
|
|
|
|
|
соединенных друг с другом. строка соответствует ветви, если ее
|
|
|
|
|
можно разбить на подстроки таким образом, что начальная
|
|
|
|
|
подстрока соответствует первой части ветви, следующая подстрока
|
|
|
|
|
- следующей части ветви и так далее.</p>
|
|
|
|
|
|
|
|
|
|
<p>Часть состоит из атома со следующим за ним необязательным
|
|
|
|
|
символом '*', '<strong>+</strong>' или '<strong>?</strong>'. Атом с последующим
|
|
|
|
|
символом <strong>*</strong> соответствует любой последовательности из нуля
|
|
|
|
|
или более подстрок, каждая из которых соответствует атому. Атом
|
|
|
|
|
с символом '<strong>+</strong>' после него соответствует любой
|
|
|
|
|
последовательности из одной или более подстрок, каждая из
|
|
|
|
|
которых соответствует атому. Атом с символом '<strong>?</strong>' после
|
|
|
|
|
него соответствует подстроке, которая соответствует атому, или
|
|
|
|
|
пустой строке.</p>
|
|
|
|
|
|
|
|
|
|
<p>Атом может быть регулярным выражением в скобках (в этом случае
|
|
|
|
|
он соответствует любой строке, которая соответствует этому
|
|
|
|
|
регулярному выражению), <em>интервалом</em> (см. ниже), символом
|
|
|
|
|
'<strong>.</strong>' (соответствует ровно одному произвольному символу),
|
|
|
|
|
'<strong>^</strong>' (соответствует нулевой строке в начале
|
|
|
|
|
<em>string</em>), '<strong>$</strong>' (соответствует нулевой строке в конце
|
|
|
|
|
<em>string</em>), '<strong>\</strong>' с последующим одним символом
|
|
|
|
|
(соответствует этому символу), или одним символом без
|
|
|
|
|
какого-либо иного смысла (соответствует этому символу).</p>
|
|
|
|
|
|
|
|
|
|
<p><em>Интервал</em> есть последовательность символов, заключенная в
|
|
|
|
|
квадратные скобки. Он обычно соответствует любому символу из
|
|
|
|
|
этого интервала. Если последовательность начинается с символа
|
|
|
|
|
'<strong>^</strong>', то она соответствует любому символу, кроме символов,
|
|
|
|
|
стоящих далее в последовательности. Если два символа в
|
|
|
|
|
последовательности разделены символом '<strong>-</strong>', то это краткая
|
|
|
|
|
форма для обозначения всех ASCII символов между этими двумя
|
|
|
|
|
(например, '[0-9]' соответствует любой десятичной цифре). Для
|
|
|
|
|
того, чтобы включить в последовательность символ '<strong>]</strong>',
|
|
|
|
|
следует поставить его на место первого в последовательности
|
|
|
|
|
(следом за возможным символом '<strong>^</strong>'). Для включения в
|
|
|
|
|
последовательность символа '<strong>-</strong>' следует сделать его первым
|
|
|
|
|
или последним символом.</p>
|
|
|
|
|
|
|
|
|
|
<h2>ВЫБОР ИЗ АЛЬТЕРНАТИВНЫХ СОСТОЯНИЙ</h2>
|
|
|
|
|
|
|
|
|
|
<p>Вообще говоря, регулярное выражение может соответствовать
|
|
|
|
|
строке несколькими различными способами. Например, рассмотрим
|
|
|
|
|
выражение</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
regexp (a*)b* aabaaabb x y
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>В соответствии с описанными выше правилами переменные <strong>x</strong>
|
|
|
|
|
и <strong>y</strong> могут принять значение <strong>aabb</strong> и <strong>aa</strong>,
|
|
|
|
|
<strong>aaab</strong> и <strong>aaa</strong>, <strong>ab</strong> и <strong>a</strong> или одну из еще
|
|
|
|
|
нескольких возможных комбинаций. Чтобы избежать этой
|
|
|
|
|
потенциальной неопределенности команда <strong>regexp</strong> выбирает
|
|
|
|
|
между возможными вариантами по правилу "первый и самый
|
|
|
|
|
длинный". Другими словами, строка и регулярное выражение
|
|
|
|
|
просматриваются слева направо, при этом выбирается часть строки
|
|
|
|
|
максимально возможной длины. Говоря точнее, при выборе
|
|
|
|
|
используются следующие правила в порядке убывания
|
|
|
|
|
приоритета.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<table>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>[1]</td>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<td><p>Если регулярное выражение соответствует двум разным
|
|
|
|
|
частям строки, выбирается та часть, которая раньше
|
|
|
|
|
начинается.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Если обе начинаются в одном и том же месте, то это
|
|
|
|
|
неопределенный (тяжелый) случай. Его можно объяснить
|
|
|
|
|
следующим образом.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
|
<td>[2]</td>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<td>Если регулярное выражение содержит символы <strong>|</strong> (то
|
|
|
|
|
есть состоит из нескольких ветвей), то будет выбрана самая
|
|
|
|
|
левая ветвь, которой что-либо соответствует.</td>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
|
<td>[3]</td>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<td>Для выражений, содержащих '<strong>*</strong>', '<strong>+</strong>' и
|
|
|
|
|
'<strong>?</strong>', выбираются самые длинные фрагменты строки,
|
|
|
|
|
соответствующие им.</td>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
|
|
<tr>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<td><a name=rule4></a>[4]</td>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<td>Компоненты выражений рассматриваются слева направо.</td>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>В приведенном выше примере <strong>(a*)b*</strong> соответствует
|
|
|
|
|
<strong>aab</strong>, так как для <strong>(a*)</strong> выбирается первый
|
|
|
|
|
соответствующий ему фрагмент, то есть начальные <strong>aa</strong>, а
|
|
|
|
|
затем для <strong>b*</strong> выбирается следующий символ
|
|
|
|
|
<strong>b</strong>. Рассмотрим еще один пример:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
regexp (ab|a)(b*)c abc x y z
|
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>После выполнения команды переменная <strong>x</strong> будет содержать
|
|
|
|
|
значение <strong>abc</strong>, переменная <strong>y</strong> - <strong>ab</strong> и
|
|
|
|
|
переменная <strong>z</strong> будет содержать пустую строку. Правило <a
|
|
|
|
|
href=#rule4>[4]</a> определяет, что поиск начнется с выражения
|
|
|
|
|
<strong>(ab|a)</strong>, а правило [2], что поиск начнется с подвыражения
|
|
|
|
|
ab. Поэтому символ <strong>b</strong> в строке будет использован, и
|
|
|
|
|
выражение <strong>(b*)</strong> будет соответствовать пустой строке.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</body>
|
|
|
|
|
</html>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
|