Translation by Artem Sereda with my minor changes
[kde-ru.git] / docs / kdesdk / kate / regular-expressions.docbook
blobd28373cacf0acf2b5b69d3e9df84a7f573876315
1 <appendix id="regular-expressions">
2 <appendixinfo>
3 <authorgroup>
4 <author
5 >&Anders.Lund; &Anders.Lund.mail;</author>
6 <othercredit role="translator"
7 ><firstname
8 >Андрей</firstname
9 ><surname
10 >Балагута</surname
11 ><affiliation
12 ><address
13 ><email
14 >uj2@mail.ru</email
15 ></address
16 ></affiliation
17 ><contrib
18 >Перевод на русский</contrib
19 ></othercredit
20
21 </authorgroup>
22 </appendixinfo>
24 <title
25 >Регулярные выражения</title>
27 <synopsis
28 >Это приложение содержит краткое, но, надеюсь, достаточно ясное введение в мир <emphasis
29 >регулярных выражений</emphasis
30 >. Здесь описаны регулярные выражения в той форме, в которой они используются в &kate;; к сожалению, они не совместимы с с регулярными выражениями perl и <command
31 >grep</command
32 >.</synopsis>
34 <sect1>
36 <title
37 >Введение</title>
39 <para
40 ><emphasis
41 >Регулярные выражения</emphasis
42 > - это средство, позволяющее описывать содержание строк в некотором формализованном виде, что даёт возможность приложениям определять принадлежность той или иной строки определённому формату. В дополнение ко всему некоторые приложения могут сохранять части совпавшей строки для их последующего использования.</para>
44 <para
45 >Приведём небольшой пример. Допустим, вы хотите найти в тексте все абзацы, которые начинаются с фамилий <quote
46 >Петров</quote
47 > или <quote
48 >Иванов</quote
49 >, за которыми следует любая форма глагола <quote
50 >рассказывать</quote
51 > (для чистоты эксперимента возьмём всего две формы <quote
52 >рассказал</quote
53 > и <quote
54 >рассказывал</quote
55 >).</para>
57 <para
58 >С помощью обычного поиска вам бы понадобилось сначала найти фамилию <quote
59 >Петров</quote
60 >, возможно, дополненную буквами <quote
61 >рассказ</quote
62 >, что-то вроде этого: <userinput
63 >Петров рассказ</userinput
64 >. При поиске совпадений пришлось бы пропускать все те строки, что стоят не в начале абзаца. После этого последовал бы повторный поиск для второй фамилии...</para>
66 <para
67 >Регулярные выражения позволяют произвести такую операцию поиска за один раз, причём с гораздо большей точностью.</para>
69 <para
70 >Регулярные выражения содержат правила, позволяющие точно выразить вид строки для поиска. Наш пример можно выразить словесно: <quote
71 >Строка, начинающаяся со слов <quote
72 >Петров</quote
73 > или <quote
74 >Иванов</quote
75 >, перед которыми могут стоять до четырёх пробелов или символов табуляции, после фамилии должен стоять пробел, за пробелом - <quote
76 >рассказ</quote
77 >, после чего может (необязательно!) стоять суффикс <quote
78 >ыв</quote
79 >, и, наконец, суффикс <quote
80 >ал</quote
81 ></quote
82 >. Посмотрите, как это можно записать в форме регулярного выражения:</para
83 > <para
84 ><userinput
85 >^[ \t]{0,4}(Петров|Иванов) рассказ(ыв)?ал</userinput
86 ></para>
88 <para
89 >Этот пример демонстрирует четыре основных понятия современных регулярных выражений:</para>
91 <itemizedlist>
92 <listitem
93 ><para
94 >Шаблоны</para
95 ></listitem>
96 <listitem
97 ><para
98 >Утверждения</para
99 ></listitem>
100 <listitem
101 ><para
102 >Кванторы</para
103 ></listitem>
104 <listitem
105 ><para
106 >Обратные ссылки</para
107 ></listitem>
108 </itemizedlist>
110 <para
111 >Значок <literal
112 >^</literal
113 >, с которого начинается выражение - это утверждение, которое подтверждает совпадение только в том случае, если совпавшая цепочка символов начинается с новой строки.</para>
115 <para
116 ><literal
117 >[ \t]</literal
118 > и <literal
119 >(Петров|Иванов) рассказ(ыв)?ал</literal
120 > - это шаблоны. Первый представляет собой <emphasis
121 >символьный класс</emphasis
122 >, который совпадает либо с пробелом, либо с символом табуляции. Второй содержит вложенный шаблон, совпадающий со словами <literal
123 >Петров</literal
124 > <emphasis
125 >или</emphasis
126 > <literal
127 >Иванов</literal
128 >, затем идёт проверка на точное совпадение со строкой <literal
129 > рассказ</literal
130 >, потом ещё один вложенный шаблон, который определяет вхождение символов <literal
131 >ыв</literal
132 >, и, в самом конце, проверка на точное совпадение с символами <literal
133 >ал</literal
134 ></para>
136 <para
137 >Строка <literal
138 >{0,4}</literal
139 > и символ вопроса после вложенного шаблона <literal
140 >(ыв)</literal
141 > - это кванторы. Первый можно трактовать следующим образом: <quote
142 >возможен повтор предыдущего символа от 0 до 4 раз</quote
143 >. Второй квантор действует аналогично, позволяя повторить стоящий перед ним вложенный шаблон 0 или 1 раз.</para>
145 <para
146 >Все приложения, работающие с регулярными выражениями и поддерживающие <emphasis
147 >обратные ссылки</emphasis
148 >, при совпадении сохраняют всю строку и вложенные шаблоны в некоторой области памяти и предоставляют средства для получения этих значений. Поэтому мы можем получить всю совпавшую строку (при поиске в редакторе она обычно выделяется цветом) или, например, только фамилию.</para>
150 <para
151 >Как вы могли убедиться на предыдущем примере, регулярные выражения - это очень эффективное средство поиска, позволяющее найти именно то, что вам нужно, без особых усилий.</para>
153 <para
154 >В следующих разделах подробно рассмотрены шаблоны, символьные классы, утверждения, кванторы и обратные ссылки. В конце этой главы вы найдёте несколько полезных примеров.</para>
156 </sect1>
158 <sect1 id="regex-patterns">
160 <title
161 >Шаблоны</title>
163 <para
164 >Шаблоны состоят из символов и символьных классов. Допускается вложенность, в этом случае вложенные шаблоны заключаются в круглые скобки.</para>
166 <sect2>
167 <title
168 >Управляющие последовательности</title>
170 <para
171 >И в шаблонах, и в символьных классах некоторые символы имеют специальное значение. Если вы хотите использовать эти символы при поиске именно как символы, нужно записать их определенным образом, чтобы анализатор регулярных выражений считал их обычными литералами.</para>
173 <para
174 >Делается это очень просто, нужно всего лишь поставить перед таким символом бэк-слеш (<literal
175 >\</literal
176 >).</para>
179 <para
180 >Анализатор регулярных выражений игнорирует обратную черту перед символами, которые не имеют специального значения в контексте; например, если вы вместо обычного символа <quote
181 >j</quote
182 > напишете <userinput
183 >\j</userinput
184 >, анализатор его воспримет просто как <quote
185 >j</quote
186 >. Таким образом, если вы не уверены, имеет ли символ специальное значение, можете спокойно ставить перед ним бэк-слеш.</para>
188 <para
189 >Чтобы использовать обратную черту в качестве литерала, продублируйте его: <userinput
190 >\\</userinput
191 >.</para>
193 </sect2>
195 <sect2>
196 <title
197 >Символьные классы и сокращения</title>
199 <para
200 ><emphasis
201 >Символьный класс</emphasis
202 > - это выражение, которое позволяет проверить один символ на принадлежность определенному набору символов. Чтобы использовать его в регулярных выражениях, нужно в квадратных скобках записать все верные символы или сокращенные классы, описанные ниже.</para>
204 <para
205 >Простые символьные классы содержат один или несколько символов, например, <userinput
206 >[abc]</userinput
207 > (проверка на любой из символов <quote
208 >a</quote
209 >, <quote
210 >b</quote
211 > или <quote
212 >c</quote
213 >) или <userinput
214 >[0123456789]</userinput
215 > (проверка на любую цифру).</para>
217 <para
218 >Поскольку буквы и цифры логически упорядоченны, вы можете сокращать классы, используя диапазоны: <userinput
219 >[a-c]</userinput
220 > аналогично <userinput
221 >[abc]</userinput
222 >, <userinput
223 >[0-9]</userinput
224 > аналогично <userinput
225 >[0123456789]</userinput
226 >. Можно комбинировать диапазоны с обычным перечислением символов: <userinput
227 >[a-fynot1-38]</userinput
228 > (проверка на любой из символов <quote
229 >a</quote
230 >,<quote
231 >b</quote
232 >,<quote
233 >c</quote
234 >,<quote
235 >d</quote
236 >, <quote
237 >e</quote
238 >,<quote
239 >f</quote
240 >,<quote
241 >y</quote
242 >,<quote
243 >n</quote
244 >,<quote
245 >o</quote
246 >,<quote
247 >t</quote
248 >, <quote
249 >1</quote
250 >,<quote
251 >2</quote
252 >,<quote
253 >3</quote
254 > или <quote
255 >8</quote
256 >).</para>
258 <para
259 >Чтобы проверить символ без учета регистра в любом случае (регулярное выражение может учитывать или не учитывать регистр символов), нужно написать примерно следующее: <userinput
260 >[aAbB]</userinput
261 >.</para>
263 <para
264 >Можно создать <quote
265 >исключающий</quote
266 > класс, который проверяет символ на <quote
267 >не-вхождение</quote
268 > в заданный набор символов. Обычный символьный класс превращается в исключающий добавлением символа <quote
269 ><literal
270 >^</literal
271 ></quote
272 > перед набором символов:  </para>
274 <para
275 ><userinput
276 >[^abc]</userinput
277 > - проверка на любой символ, <emphasis
278 >кроме</emphasis
279 > <quote
280 >a</quote
281 >, <quote
282 >b</quote
283 > и <quote
284 >c</quote
285 >.</para>
287 <para
288 >В дополнение к обычным литералам можно использовать следующие сокращения: <variablelist>
290 <varlistentry>
291 <term
292 ><userinput
293 >\a</userinput
294 ></term>
295 <listitem
296 ><para
297 >Проверка на <acronym
298 >ASCII</acronym
299 >-символ звонка (BEL, 0x07).</para
300 ></listitem>
301 </varlistentry>
303 <varlistentry>
304 <term
305 ><userinput
306 >\f</userinput
307 ></term>
308 <listitem
309 ><para
310 >Проверка на <acronym
311 >ASCII</acronym
312 >-символ перевода страницы (FF, 0x0C).</para
313 ></listitem>
314 </varlistentry>
316 <varlistentry>
317 <term
318 ><userinput
319 >\n</userinput
320 ></term>
321 <listitem
322 ><para
323 >Проверка на символ перевода строки (LF, 0x0A, символ перехода на новую строку в Unix).</para
324 ></listitem>
325 </varlistentry>
327 <varlistentry>
328 <term
329 ><userinput
330 >\r</userinput
331 ></term>
332 <listitem
333 ><para
334 >Проверка на символ возврата каретки (CR, 0x0D).</para
335 ></listitem>
336 </varlistentry>
338 <varlistentry>
339 <term
340 ><userinput
341 >\t</userinput
342 ></term>
343 <listitem
344 ><para
345 >Проверка на символ горизонтальной табуляции (HT, 0x09)</para
346 ></listitem>
347 </varlistentry>
349 <varlistentry>
350 <term
351 ><userinput
352 >\v</userinput
353 ></term>
354 <listitem
355 ><para
356 >Проверка на символ вертикальной табуляции (VT, 0x0B).</para
357 ></listitem>
358 </varlistentry>
359 <varlistentry>
360 <term
361 ><userinput
362 >\xhhhh</userinput
363 ></term>
365 <listitem
366 ><para
367 >Проверка на символ в кодировке Unicode, соответствующий номеру hhhh (в пределах 0x0000-0xFFFF). \0ooo (первый символ - ноль) - проверка на символ в кодировке <acronym
368 >ASCII</acronym
369 >/Latin-1, соответствующий восьмеричному номеру ooo (в пределах 0-0377).</para
370 ></listitem>
371 </varlistentry>
373 <varlistentry>
374 <term
375 ><userinput
376 >.</userinput
377 > (точка)</term>
378 <listitem
379 ><para
380 >Проверка на любой символ (включая переход на новую строку).</para
381 ></listitem>
382 </varlistentry>
384 <varlistentry>
385 <term
386 ><userinput
387 >\d</userinput
388 ></term>
389 <listitem
390 ><para
391 >Проверка на цифровой символ. Аналогично классу <literal
392 >[0-9]</literal
393 >.</para
394 ></listitem>
395 </varlistentry>
397 <varlistentry>
398 <term
399 ><userinput
400 >\D</userinput
401 ></term>
402 <listitem
403 ><para
404 >Проверка на любой символ, не являющийся цифровым. Аналогично <literal
405 >[^0-9]</literal
406 > или <literal
407 >[^\d]</literal
408 ></para
409 ></listitem>
410 </varlistentry>
412 <varlistentry>
413 <term
414 ><userinput
415 >\s</userinput
416 ></term>
417 <listitem
418 ><para
419 >Проверка на пробельный символ. Фактически аналогично классу <literal
420 >[ \t\n\r]</literal
421 ></para
422 ></listitem>
423 </varlistentry>
425 <varlistentry>
426 <term
427 ><userinput
428 >\S</userinput
429 ></term>
430 <listitem
431 ><para
432 >Проверка на любой символ, не являющийся пробельным. Фактически равнозначно <literal
433 >[^ \t\r\n]</literal
434 > и аналогично <literal
435 >[^\s]</literal
436 ></para
437 ></listitem>
438 </varlistentry>
440 <varlistentry>
441 <term
442 ><userinput
443 >\w</userinput
444 ></term>
445 <listitem
446 ><para
447 >Проверка на любой алфавитно-цифровой символ (как вы поняли, сюда включаются все буквы и цифры). Подчеркивание (<literal
448 >_</literal
449 >) не входит в этот класс, в отличие от регулярных выражений perl. Это сокращение аналогично классу <literal
450 >[a-zA-Z0-9]</literal
451 ></para
452 ></listitem>
453 </varlistentry>
455 <varlistentry>
456 <term
457 ><userinput
458 >\W</userinput
459 ></term>
460 <listitem
461 ><para
462 >Проверка на любой символ, не являющийся алфавитно-цифровым. Аналогично классу <literal
463 >[^a-zA-Z0-9]</literal
464 > или <literal
465 >[^\w]</literal
466 ></para
467 ></listitem>
468 </varlistentry>
471 </variablelist>
473 </para>
475 <para
476 >Аббревиатурные классы можно помещать в обычные классы; например, чтобы выполнить проверку на алфавитно-цифровой символ, точку или пробел, вы можете написать так: <userinput
477 >[\w \.]</userinput
478 ></para
481 <note
482 > <para
483 >В текущей версии не поддерживается нотация классов POSIX (<userinput
484 >[:&lt;class name&gt;:]</userinput
485 >).</para
486 > </note>
488 <sect3>
489 <title
490 >Символы со специальным значением в символьных классах</title>
492 <para
493 >Ниже перечислены символы, имеющие специальное значение в определениях символьных классов (<quote
494 >[]</quote
495 >). Для использования в качестве обычных литералов они должны быть предварены бэк-слешем.</para>
497 <variablelist>
498 <varlistentry>
499 <term
500 ><userinput
501 >]</userinput
502 ></term>
503 <listitem
504 ><para
505 >Закрывает символьный класс. Этот символ должен быть предварен бэк-слешем, кроме тех случаев, когда стоит непосредственно в начале класса или сразу после символа <userinput
506 >^</userinput
507 ></para
508 ></listitem>
509 </varlistentry>
510 <varlistentry>
511 <term
512 ><userinput
513 >^</userinput
514 ></term>
515 <listitem
516 ><para
517 >Если стоит в начале, объявляет исключающий класс. Чтобы использовать как литерал в начале класса, нужно поставить бэк-слеш, иначе слеш не нужен.</para
518 ></listitem
520 </varlistentry>
521 <varlistentry>
522 <term
523 ><userinput
524 >-</userinput
525 > (дефис)</term>
526 <listitem
527 ><para
528 >Определяет логический диапазон. Чтобы использовать в качестве литерала, всегда нужно ставить бэк-слеш.</para
529 ></listitem>
530 </varlistentry>
531 <varlistentry>
532 <term
533 ><userinput
534 >\</userinput
535 > (обратная черта)</term>
536 <listitem
537 ><para
538 >Спецсимвол (escape character). Чтобы использовать как литерал, продублируйте.</para
539 ></listitem>
540 </varlistentry>
542 </variablelist>
544 </sect3>
546 </sect2>
548 <sect2>
550 <title
551 >Альтернативы: проверка на <quote
552 >один из</quote
553 > нескольких шаблонов</title>
555 <para
556 >Если вы хотите выполнить проверку на один (любой) шаблон из определенного набора, используйте альтернативы. Чтобы объявить альтернативу, нужно все шаблоны набора записать через пайп (<literal
557 >|</literal
558 >).</para>
560 <para
561 >Например, чтобы найти любое из имён <quote
562 >Вася</quote
563 > и <quote
564 >Петя</quote
565 >, нужно использовать такое выражение: <userinput
566 >Вася|Петя</userinput
567 >.</para>
569 </sect2>
571 <sect2>
573 <title
574 >Вложенные шаблоны</title>
576 <para
577 ><emphasis
578 >Вложенными</emphasis
579 > называются шаблоны, заключенные в круглые скобки. Они используются в разных целях:</para>
581 <sect3>
583 <title
584 >Определение альтернатив</title>
586 <para
587 >Используя вложенные шаблоны, вы можете группировать набор альтернатив внутри сложных шаблонов. Напомню, альтернативы разделяются символом пайп (<quote
588 >|</quote
589 >).</para>
591 <para
592 >Например, чтобы найти одно из слов <quote
593 >int</quote
594 >, <quote
595 >float</quote
596 > или <quote
597 >double</quote
598 >, вы можете использовать шаблон <userinput
599 >int|float|double</userinput
600 >. Если же вы хотите найти одно из этих слов, за которым идут пробелы, а за ними какие-то символы, то вы должны оформить альтернативу как вложенный шаблон: <userinput
601 >(int|float|double)\s+\w+</userinput
602 >.</para>
604 </sect3>
606 <sect3>
608 <title
609 >Захват совпавшего текста (обратные ссылки)</title>
611 <para
612 >Чтобы создать обратную ссылку, оформите как вложенный шаблон ту часть выражения, которую нужно запомнить.</para>
614 <para
615 >Например, если вы хотите найти два одинаковых слова, разделённых запятой и, возможно, пробелами, можно использовать такое выражение: <userinput
616 >(\w+),\s*\1</userinput
617 >. Вложенный шаблон <literal
618 >\w+</literal
619 > ищет цепочку алфавитно-цифровых символов, а всё выражение ищет ту же цепочку, за которой следует запятая, далее могут идти пробелы, а за ними точно такая же цепочка (строка <literal
620 >\1</literal
621 > ссылается на <emphasis
622 >первый вложенный шаблон, заключенный в круглые скобки</emphasis
623 >).</para>
625 <!-- <para
626 >See also <link linkend="backreferences"
627 >Back references</link
628 >.</para
629 > -->
631 </sect3>
633 <sect3 id="lookahead-assertions">
634 <title
635 >Просматривающие утверждения</title>
637 <para
638 >Просматривающее утверждение - это вложенный шаблон, который начинается с символов <literal
639 >?=</literal
640 > или <literal
641 >?!</literal
642 >.</para>
644 <para
645 >Например, чтобы найти слово <quote
646 >Билл</quote
647 >, за которым может следовать что угодно, кроме слова <quote
648 > Гейтс</quote
649 >, нужно составить такое выражение: <userinput
650 >Билл(?! Гейтс)</userinput
651 > (оно совпадет с <quote
652 >Билл Клинтон</quote
653 >, <quote
654 >Билли хороший мальчик</quote
655 >, но не с именем известного магната).</para>
657 <para
658 >Вложенные шаблоны, использующиеся в качестве утверждений, не запоминаются.</para>
660 <para
661 >Смотрите также раздел <link linkend="assertions"
662 ><quote
663 >Утверждения</quote
664 ></link
665 ></para>
667 </sect3>
669 </sect2>
671 <sect2 id="special-characters-in-patterns">
672 <title
673 >Символы со специальным значением в шаблонах</title>
675 <para
676 >Следующие символы имеют специальное значение в шаблонах, поэтому, чтобы использовать их в качестве обычных символов, нужно впереди ставить обратную черту: <variablelist>
678 <varlistentry>
679 <term
680 ><userinput
681 >\</userinput
682 > (обратная черта)</term>
683 <listitem
684 ><para
685 >С него должны начинаться все спецсимволы.</para
686 ></listitem>
687 </varlistentry>
689 <varlistentry>
690 <term
691 ><userinput
692 >^</userinput
693 ></term>
694 <listitem
695 ><para
696 >Проверка на начало строки.</para
697 ></listitem>
698 </varlistentry>
700 <varlistentry>
701 <term
702 ><userinput
703 >$</userinput
704 ></term>
705 <listitem
706 ><para
707 >Проверка на конец строки.</para
708 ></listitem>
709 </varlistentry>
711 <varlistentry>
712 <term
713 ><userinput
714 >()</userinput
715 > (левая и правая круглые скобки)</term>
716 <listitem
717 ><para
718 >Объявление вложенного шаблона.</para
719 ></listitem>
720 </varlistentry>
722 <varlistentry>
723 <term
724 ><userinput
725 >{}</userinput
726 > (левая и правая фигурные скобки)</term>
727 <listitem
728 ><para
729 >Объявление числового квантора.</para
730 ></listitem>
731 </varlistentry>
733 <varlistentry>
734 <term
735 ><userinput
736 >[]</userinput
737 > (левая и правая квадратные скобки)</term>
738 <listitem
739 ><para
740 >Объявление символьного класса.</para
741 ></listitem>
742 </varlistentry>
744 <varlistentry>
745 <term
746 ><userinput
747 >|</userinput
748 > (вертикальная черта)</term>
749 <listitem
750 ><para
751 >Логическое ИЛИ. Используется для разделения альтернатив.</para
752 ></listitem>
753 </varlistentry>
755 <varlistentry>
756 <term
757 ><userinput
758 >+</userinput
759 > (плюс)</term>
760 <listitem
761 ><para
762 >Квантор <quote
763 >один или более</quote
764 >.</para
765 ></listitem>
766 </varlistentry>
768 <varlistentry>
769 <term
770 ><userinput
771 >*</userinput
772 > (звездочка)</term>
773 <listitem
774 ><para
775 >Квантор <quote
776 >ноль или более</quote
777 >.</para
778 ></listitem>
779 </varlistentry>
781 <varlistentry>
782 <term
783 ><userinput
784 >?</userinput
785 > (знак вопроса)</term>
786 <listitem
787 ><para
788 >Необязательный символ. Можно считать его квантором <quote
789 >ноль или один</quote
790 >.</para
791 ></listitem>
792 </varlistentry>
794 </variablelist>
796 </para>
798 </sect2>
800 </sect1>
802 <sect1 id="quantifiers">
803 <title
804 >Кванторы</title>
806 <para
807 ><emphasis
808 >Кванторы</emphasis
809 > выполняют проверку на определенное количество повторений символа, шаблона или символьного класса.</para>
811 <para
812 >Кванторы записываются в фигурных скобках (<literal
813 >{</literal
814 > и <literal
815 >}</literal
816 >). Общий вид квантора: <literal
817 >{[минимальное-количество-совпадений][,[максимальное-количество-совпадений]]}</literal
818 > </para>
820 <para
821 >Использование кванторов лучше пояснить на примерах: <variablelist>
823 <varlistentry>
824 <term
825 ><userinput
826 >{1}</userinput
827 ></term>
828 <listitem
829 ><para
830 >Ровно одно появление</para
831 ></listitem>
832 </varlistentry>
834 <varlistentry>
835 <term
836 ><userinput
837 >{0,1}</userinput
838 ></term>
839 <listitem
840 ><para
841 >Ноль или одно появление</para
842 ></listitem>
843 </varlistentry>
845 <varlistentry>
846 <term
847 ><userinput
848 >{,1}</userinput
849 ></term>
850 <listitem
851 ><para
852 >То же самое, но набирать меньше ;)</para
853 ></listitem>
854 </varlistentry>
856 <varlistentry>
857 <term
858 ><userinput
859 >{5,10}</userinput
860 ></term>
861 <listitem
862 ><para
863 >Как минимум 5 повторений, максимум - 10.</para
864 ></listitem>
865 </varlistentry>
867 <varlistentry>
868 <term
869 ><userinput
870 >{5,}</userinput
871 ></term>
872 <listitem
873 ><para
874 >Как минимум 5 повторений (без верхней границы).</para
875 ></listitem>
876 </varlistentry>
878 </variablelist>
880 </para>
882 <para
883 >Также определены несколько сокращений: <variablelist>
885 <varlistentry>
886 <term
887 ><userinput
888 >*</userinput
889 > (звездочка)</term>
890 <listitem
891 ><para
892 >аналогично <literal
893 >{0,}</literal
894 >, найти любое количество повторений (вплоть до нуля повторений).</para
895 ></listitem>
896 </varlistentry>
898 <varlistentry>
899 <term
900 ><userinput
901 >+</userinput
902 > (плюс)</term>
903 <listitem
904 ><para
905 >аналогично <literal
906 >{1,}</literal
907 >, как минимум одно появление.</para
908 ></listitem>
909 </varlistentry>
911 <varlistentry>
912 <term
913 ><userinput
914 >?</userinput
915 > (знак вопроса)</term>
916 <listitem
917 ><para
918 >аналогично <literal
919 >{0,1}</literal
920 >, ноль или одно появление.</para
921 ></listitem>
922 </varlistentry>
924 </variablelist>
926 </para>
928 <sect2>
930 <title
931 >Жадность</title>
933 <para
934 >Используя кванторы без ограничений максимума, регулярное выражение захватывает строку по максимуму, такое поведение называется <emphasis
935 >жадным</emphasis
936 >.</para>
938 <para
939 >Современные анализаторы позволяют определять как жадные, так и нежадные регулярные выражения. В основном, это проявляется в соответствующих элементах графического интерфейса, например, в диалоге поиска может быть опция <quote
940 >Минимальное совпадение</quote
941 >.</para>
943 </sect2>
945 <sect2>
946 <title
947 >Примеры использования</title>
949 <para
950 >Здесь приведено несколько примеров использования кванторов.</para>
952 <variablelist>
954 <varlistentry>
955 <term
956 ><userinput
957 >^\d{4,5}\s</userinput
958 ></term>
959 <listitem
960 ><para
961 >Совпадет с <quote
962 >1234 вперед</quote
963 > и <quote
964 >12345 стоп</quote
965 >, но не совпадет ни с <quote
966 >567 восемь</quote
967 >, ни с <quote
968 >223459 много</quote
969 >.</para
970 ></listitem>
971 </varlistentry>
973 <varlistentry>
974 <term
975 ><userinput
976 >\s+</userinput
977 ></term>
978 <listitem
979 ><para
980 >Проверка на один или более пробельных символов.</para
981 ></listitem>
982 </varlistentry>
984 <varlistentry>
985 <term
986 ><userinput
987 >(ля){1,}</userinput
988 ></term>
989 <listitem
990 ><para
991 >Совпадет с <quote
992 >ляляля</quote
993 > и с подстрокой <quote
994 >ля</quote
995 > в словах <quote
996 >кляча</quote
997 > и <quote
998 >земля</quote
999 ></para
1000 ></listitem>
1001 </varlistentry>
1003 <varlistentry>
1004 <term
1005 ><userinput
1006 >/?&gt;</userinput
1007 ></term>
1008 <listitem
1009 ><para
1010 >Совпадет с <quote
1011 >/&gt;</quote
1012 > в <quote
1013 >&lt;closeditem/&gt;</quote
1014 >, а также с <quote
1015 >&gt;</quote
1016 > в строке <quote
1017 >&lt;openitem&gt;</quote
1018 >.</para
1019 ></listitem>
1020 </varlistentry>
1022 </variablelist>
1024 </sect2>
1026 </sect1>
1028 <sect1 id="assertions">
1029 <title
1030 >Утверждения</title>
1032 <para
1033 ><emphasis
1034 >Утверждения</emphasis
1035 > накладывают дополнительные условия на проверку регулярного выражения.</para>
1037 <para
1038 >Утверждение не проверяет символы, скорее, оно анализирует совпавшую строку перед тем как подтвердить совпадение. Например, утверждение <emphasis
1039 >граница слова</emphasis
1040 > не пытается найти символ-разделитель слов, наоборот, оно проверяет, что в данной позиции нет алфавитно-цифрового символа. Это означает, что утверждение будет верно даже в случае отсутствия символа-разделителя, например, в конце строки поиска.</para>
1042 <para
1043 >Некоторые утверждения являются шаблонами, но они лишь проверяют, есть или нет в данном месте строки совпадение заданному шаблону, не включая его в конечный результат.</para>
1045 <para
1046 >Регулярные выражения, описанные в этом руководстве, поддерживают следующие утверждения: <variablelist>
1048 <varlistentry
1050 <term
1051 ><userinput
1052 >^</userinput
1053 > (начало строки)</term
1055 <listitem
1056 ><para
1057 >Проверка на начало строки.</para
1058 > <para
1059 >Выражение <userinput
1060 >^Петр</userinput
1061 > совпадет с <quote
1062 >Петр</quote
1063 > в строке <quote
1064 >Петр, здравствуйте!</quote
1065 >, но не в строке <quote
1066 >Здравствуйте, Петр!</quote
1067 >. </para
1068 > </listitem>
1069 </varlistentry>
1071 <varlistentry>
1072 <term
1073 ><userinput
1074 >$</userinput
1075 > (конец строки)</term>
1076 <listitem
1077 ><para
1078 >Проверка на конец строки поиска.</para>
1080 <para
1081 >Выражение <userinput
1082 >ты\?$</userinput
1083 > совпадет с последним <quote
1084 >ты</quote
1085 > в строке <quote
1086 >- Ты не сделаешь этого! - А ты?</quote
1087 >, но не совпадет ни с какой частью строки <quote
1088 >Ты не сделал этого, так?</quote
1089 >.</para>
1091 </listitem>
1092 </varlistentry>
1094 <varlistentry>
1095 <term
1096 ><userinput
1097 >\b</userinput
1098 > (граница слова)</term>
1099 <listitem
1100 ><para
1101 >Проверяет, есть ли в данном месте с одной стороны алфавитно-цифровой символ, а с другой - не алфавитно-цифровой (необязательно разделитель!).</para>
1102 <para
1103 >Это утверждение используется для поиска границ слов; например, можно использовать два таких утверждения, чтобы найти целое слово. Выражение <userinput
1104 >\bиз\b</userinput
1105 > совпадет с отдельным словом <quote
1106 >из</quote
1107 > во фразе <quote
1108 >Он выпал из этого окна, хорошо хоть, что тут низко</quote
1109 >, но не совпадет с <quote
1110 >из</quote
1111 > в слове <quote
1112 >низко</quote
1113 >.</para
1114 ></listitem>
1116 </varlistentry>
1118 <varlistentry>
1119 <term
1120 ><userinput
1121 >\B</userinput
1122 > (нет границы слова)</term>
1123 <listitem
1124 ><para
1125 >Действие этого утверждения обратно утверждению <quote
1126 >\b</quote
1127 >.</para>
1128 <para
1129 >Это значит, что данное утверждение будет совпадать, например, в середине слова: выражение <userinput
1130 >\Bце\B</userinput
1131 > совпадет с <quote
1132 >це</quote
1133 > в строке <quote
1134 >сцена</quote
1135 >, но не в <quote
1136 >целое</quote
1137 >.</para>
1138 </listitem>
1139 </varlistentry>
1141 <varlistentry>
1142 <term
1143 ><userinput
1144 >(?=ШАБЛОН)</userinput
1145 > (подтверждающий просмотр)</term>
1146 <listitem
1147 ><para
1148 >Просматривающие утверждения действуют аналогично обычным шаблонам, с той лишь разницей, что текст, совпавший (или не совпавший, в зависимости от типа просмотра) с утверждением, не будет включен в результирующее совпадение. Подтверждающий просмотр проверяет текст на предмет совпадения с <emphasis
1149 >ШАБЛОНОМ</emphasis
1150 > утверждения.</para>
1151 <para
1152 >Выражение <userinput
1153 >программ(?=\w)</userinput
1154 > совпадет с <quote
1155 >программ</quote
1156 > в слове <quote
1157 >программист</quote
1158 >, но не во фразе <quote
1159 >Он написал много хороших программ!</quote
1160 >.</para>
1161 </listitem>
1162 </varlistentry>
1164 <varlistentry>
1165 <term
1166 ><userinput
1167 >(?!ШАБЛОН)</userinput
1168 > (отрицающий просмотр)</term>
1170 <listitem
1171 ><para
1172 >Отрицающий просмотр проверяет текст на предмет несовпадения с <emphasis
1173 >ШАБЛОНОМ</emphasis
1174 >.</para>
1175 <para
1176 >Выражение  <userinput
1177 >const \w+\b(?!\s*&amp;)</userinput
1178 > совпадет с <quote
1179 >const char</quote
1180 > в строке <quote
1181 >const char* foo</quote
1182 >, но не совпадет с <quote
1183 >const QString</quote
1184 > в <quote
1185 >const QString&amp; bar</quote
1186 >, поскольку <quote
1187 >&amp;</quote
1188 > совпадает с шаблоном отрицающего просмотра.</para>
1189 </listitem>
1190 </varlistentry>
1192 </variablelist>
1194 </para>
1196 </sect1>
1198 <!-- TODO sect1 id="backreferences">
1200 <title
1201 >Back References</title>
1203 <para
1204 ></para>
1206 </sect1 -->
1208 </appendix>