~ubuntu-branches/ubuntu/raring/kde-l10n-ru/raring-updates

« back to all changes in this revision

Viewing changes to docs/applications/kate/regular-expressions.docbook

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2013-04-04 14:14:50 UTC
  • mfrom: (1.12.27)
  • Revision ID: package-import@ubuntu.com-20130404141450-lqseg4jsx5xz0knh
Tags: 4:4.10.2-0ubuntu1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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>
 
23
 
 
24
<title
 
25
>Регулярные выражения</title>
 
26
 
 
27
<synopsis
 
28
>Это приложение содержит краткое, но, надеюсь, достаточно ясное введение в мир <emphasis
 
29
>регулярных выражений</emphasis
 
30
>. Здесь описаны регулярные выражения в той форме, в которой они используются в &kate;; к сожалению, они не совместимы с с регулярными выражениями perl и <command
 
31
>grep</command
 
32
>.</synopsis>
 
33
 
 
34
<sect1>
 
35
 
 
36
<title
 
37
>Введение</title>
 
38
 
 
39
<para
 
40
><emphasis
 
41
>Регулярные выражения</emphasis
 
42
> - это средство, позволяющее описывать содержание строк в некотором формализованном виде, что даёт возможность приложениям определять принадлежность той или иной строки определённому формату. В дополнение ко всему некоторые приложения могут сохранять части совпавшей строки для их последующего использования.</para>
 
43
 
 
44
<para
 
45
>Приведём небольшой пример. Допустим, вы хотите найти в тексте все абзацы, которые начинаются с фамилий <quote
 
46
>Петров</quote
 
47
> или <quote
 
48
>Иванов</quote
 
49
>, за которыми следует любая форма глагола <quote
 
50
>рассказывать</quote
 
51
> (для чистоты эксперимента возьмём всего две формы <quote
 
52
>рассказал</quote
 
53
> и <quote
 
54
>рассказывал</quote
 
55
>).</para>
 
56
 
 
57
<para
 
58
>С помощью обычного поиска вам бы понадобилось сначала найти фамилию  <quote
 
59
>Петров</quote
 
60
>, возможно, дополненную буквами <quote
 
61
>рассказ</quote
 
62
>, что-то вроде этого: <userinput
 
63
>Петров рассказ</userinput
 
64
>. При поиске совпадений пришлось бы пропускать все строки, которые стоят не в начале абзаца. После этого последовал бы повторный поиск для второй фамилии...</para>
 
65
 
 
66
<para
 
67
>Регулярные выражения позволяют произвести такую операцию поиска за один раз, причём с гораздо большей точностью.</para>
 
68
 
 
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>
 
87
 
 
88
<para
 
89
>Этот пример демонстрирует четыре основных понятия современных регулярных выражений:</para>
 
90
 
 
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>
 
109
 
 
110
<para
 
111
>Значок <literal
 
112
>^</literal
 
113
>, с которого начинается выражение - это утверждение, которое подтверждает совпадение только в том случае, если совпавшая цепочка символов начинается с новой строки.</para>
 
114
 
 
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>
 
135
 
 
136
<para
 
137
>Строка <literal
 
138
>{0,4}</literal
 
139
> и символ вопроса после вложенного шаблона <literal
 
140
>(ыв)</literal
 
141
> - это кванторы. Первый можно трактовать следующим образом: <quote
 
142
>возможен повтор предыдущего символа от 0 до 4 раз</quote
 
143
>. Второй квантор действует аналогично, позволяя повторить стоящий перед ним вложенный шаблон 0 или 1 раз.</para>
 
144
 
 
145
<para
 
146
>Все приложения, работающие с регулярными выражениями и поддерживающие <emphasis
 
147
>обратные ссылки</emphasis
 
148
>, при совпадении сохраняют всю строку и вложенные шаблоны в некоторой области памяти и предоставляют средства для получения этих значений. Поэтому мы можем получить всю совпавшую строку (при поиске в редакторе она обычно выделяется цветом) или, например, только фамилию.</para>
 
149
 
 
150
<para
 
151
>Как вы могли убедиться на предыдущем примере, регулярные выражения - это очень эффективное средство поиска, позволяющее найти именно то, что вам нужно, без особых усилий.</para>
 
152
 
 
153
<para
 
154
>В следующих разделах подробно рассмотрены шаблоны, символьные классы, утверждения, кванторы и обратные ссылки. В конце этой главы вы найдёте несколько полезных примеров.</para>
 
155
 
 
156
</sect1>
 
157
 
 
158
<sect1 id="regex-patterns">
 
159
 
 
160
<title
 
161
>Шаблоны</title>
 
162
 
 
163
<para
 
164
>Шаблоны состоят из символов и символьных классов. Допускается вложенность, в этом случае вложенные шаблоны заключаются в круглые скобки.</para>
 
165
 
 
166
<sect2>
 
167
<title
 
168
>Управляющие последовательности</title>
 
169
 
 
170
<para
 
171
>И в шаблонах, и в символьных классах некоторые символы имеют специальное значение. Если вы хотите использовать эти символы при поиске именно как символы, нужно записать их определённым образом, чтобы анализатор регулярных выражений считал их обычными литералами.</para>
 
172
 
 
173
<para
 
174
>Делается это очень просто, нужно всего лишь поставить перед таким символом бэк-слеш (<literal
 
175
>\</literal
 
176
>).</para>
 
177
 
 
178
 
 
179
<para
 
180
>Анализатор регулярных выражений игнорирует обратную черту перед символами, которые не имеют специального значения в контексте; например, если вы вместо обычного символа <quote
 
181
>j</quote
 
182
> напишете <userinput
 
183
>\j</userinput
 
184
>, анализатор его воспримет просто как <quote
 
185
>j</quote
 
186
>. Таким образом, если вы не уверены, имеет ли символ специальное значение, можете спокойно ставить перед ним бэк-слеш.</para>
 
187
 
 
188
<para
 
189
>Для указания собственно обратной черты (в качестве литерала), продублируйте его: <userinput
 
190
>\\</userinput
 
191
>.</para>
 
192
 
 
193
</sect2>
 
194
 
 
195
<sect2>
 
196
<title
 
197
>Символьные классы и сокращения</title>
 
198
 
 
199
<para
 
200
><emphasis
 
201
>Символьный класс</emphasis
 
202
> - это выражение, которое позволяет проверить один символ на принадлежность определённому набору символов. Чтобы использовать его в регулярных выражениях, нужно в квадратных скобках записать все верные символы или сокращенные классы, описанные ниже.</para>
 
203
 
 
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>
 
216
 
 
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>
 
257
 
 
258
<para
 
259
>Чтобы проверить символ без учета регистра в любом случае (регулярное выражение может учитывать или не учитывать регистр символов), нужно написать примерно следующее: <userinput
 
260
>[aAbB]</userinput
 
261
>.</para>
 
262
 
 
263
<para
 
264
>Можно создать <quote
 
265
>исключающий</quote
 
266
> класс, который проверяет символ на <quote
 
267
>невхождение</quote
 
268
> в заданный набор символов. Обычный символьный класс превращается в исключающий добавлением символа <quote
 
269
><literal
 
270
>^</literal
 
271
></quote
 
272
> перед набором символов:  </para>
 
273
 
 
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>
 
286
 
 
287
<para
 
288
>В дополнение к обычным литералам можно использовать следующие сокращения: <variablelist>
 
289
 
 
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>
 
302
 
 
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>
 
315
 
 
316
<varlistentry>
 
317
<term
 
318
><userinput
 
319
>\n</userinput
 
320
></term>
 
321
<listitem
 
322
><para
 
323
>Проверка на символ перевода строки (LF, 0x0A, символ перехода на новую строку в Unix).</para
 
324
></listitem>
 
325
</varlistentry>
 
326
 
 
327
<varlistentry>
 
328
<term
 
329
><userinput
 
330
>\r</userinput
 
331
></term>
 
332
<listitem
 
333
><para
 
334
>Проверка на символ возврата каретки (CR, 0x0D).</para
 
335
></listitem>
 
336
</varlistentry>
 
337
 
 
338
<varlistentry>
 
339
<term
 
340
><userinput
 
341
>\t</userinput
 
342
></term>
 
343
<listitem
 
344
><para
 
345
>Проверка на символ горизонтальной табуляции (HT, 0x09)</para
 
346
></listitem>
 
347
</varlistentry>
 
348
 
 
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>
 
364
 
 
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>
 
372
 
 
373
<varlistentry>
 
374
<term
 
375
><userinput
 
376
>.</userinput
 
377
> (точка)</term>
 
378
<listitem
 
379
><para
 
380
>Проверка на любой символ (включая переход на новую строку).</para
 
381
></listitem>
 
382
</varlistentry>
 
383
 
 
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>
 
396
 
 
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>
 
411
 
 
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>
 
424
 
 
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>
 
439
 
 
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>
 
454
 
 
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>
 
469
 
 
470
 
 
471
</variablelist>
 
472
 
 
473
</para>
 
474
 
 
475
<para
 
476
>Аббревиатурные классы можно помещать в обычные классы; например, чтобы выполнить проверку на алфавитно-цифровой символ, точку или пробел, вы можете написать так: <userinput
 
477
>[\w \.]</userinput
 
478
></para
 
479
 
480
 
 
481
<note
 
482
> <para
 
483
>В текущей версии не поддерживается нотация классов POSIX (<userinput
 
484
>[:&lt;class name&gt;:]</userinput
 
485
>).</para
 
486
> </note>
 
487
 
 
488
<sect3>
 
489
<title
 
490
>Символы со специальным значением в символьных классах</title>
 
491
 
 
492
<para
 
493
>Ниже перечислены символы, имеющие специальное значение в определениях символьных классов (<quote
 
494
>[]</quote
 
495
>). Для использования в качестве обычных литералов они должны быть предварены бэк-слешем.</para>
 
496
 
 
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
 
519
 
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>
 
541
 
 
542
</variablelist>
 
543
 
 
544
</sect3>
 
545
 
 
546
</sect2>
 
547
 
 
548
<sect2>
 
549
 
 
550
<title
 
551
>Альтернативы: проверка на <quote
 
552
>один из</quote
 
553
> нескольких шаблонов</title>
 
554
 
 
555
<para
 
556
>Если вы хотите выполнить проверку на один (любой) шаблон из определённого набора, используйте альтернативы. Чтобы объявить альтернативу, нужно все шаблоны набора записать через пайп (<literal
 
557
>|</literal
 
558
>).</para>
 
559
 
 
560
<para
 
561
>Например, чтобы найти любое из имён <quote
 
562
>Вася</quote
 
563
> и <quote
 
564
>Петя</quote
 
565
>, нужно использовать такое выражение: <userinput
 
566
>Вася|Петя</userinput
 
567
>.</para>
 
568
 
 
569
</sect2>
 
570
 
 
571
<sect2>
 
572
 
 
573
<title
 
574
>Вложенные шаблоны</title>
 
575
 
 
576
<para
 
577
><emphasis
 
578
>Вложенными</emphasis
 
579
> называются шаблоны, заключенные в круглые скобки. Они используются в разных целях:</para>
 
580
 
 
581
<sect3>
 
582
 
 
583
<title
 
584
>Определение альтернатив</title>
 
585
 
 
586
<para
 
587
>Используя вложенные шаблоны, вы можете группировать набор альтернатив внутри сложных шаблонов. Напомню, альтернативы разделяются символом пайп (<quote
 
588
>|</quote
 
589
>).</para>
 
590
 
 
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>
 
603
 
 
604
</sect3>
 
605
 
 
606
<sect3>
 
607
 
 
608
<title
 
609
>Захват совпавшего текста (обратные ссылки)</title>
 
610
 
 
611
<para
 
612
>Чтобы создать обратную ссылку, оформите как вложенный шаблон ту часть выражения, которую нужно запомнить.</para>
 
613
 
 
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>
 
624
 
 
625
<!-- <para
 
626
>See also <link linkend="backreferences"
 
627
>Back references</link
 
628
>.</para
 
629
> -->
 
630
 
 
631
</sect3>
 
632
 
 
633
<sect3 id="lookahead-assertions">
 
634
<title
 
635
>Просматривающие утверждения</title>
 
636
 
 
637
<para
 
638
>Просматривающее утверждение - это вложенный шаблон, который начинается с символов <literal
 
639
>?=</literal
 
640
> или <literal
 
641
>?!</literal
 
642
>.</para>
 
643
 
 
644
<para
 
645
>Например, чтобы найти слово <quote
 
646
>Билл</quote
 
647
>, за которым может следовать что угодно, кроме слова <quote
 
648
> Гейтс</quote
 
649
>, нужно составить такое выражение: <userinput
 
650
>Билл(?! Гейтс)</userinput
 
651
> (оно совпадёт с <quote
 
652
>Билл Клинтон</quote
 
653
>, <quote
 
654
>Билли хороший мальчик</quote
 
655
>, но не с именем известного магната).</para>
 
656
 
 
657
<para
 
658
>Вложенные шаблоны, использующиеся в качестве утверждений, не запоминаются.</para>
 
659
 
 
660
<para
 
661
>Смотрите также раздел <link linkend="assertions"
 
662
><quote
 
663
>Утверждения</quote
 
664
></link
 
665
></para>
 
666
 
 
667
</sect3>
 
668
 
 
669
</sect2>
 
670
 
 
671
<sect2 id="special-characters-in-patterns">
 
672
<title
 
673
>Символы со специальным значением в шаблонах</title>
 
674
 
 
675
<para
 
676
>Следующие символы имеют специальное значение в шаблонах, поэтому, чтобы использовать их в качестве обычных символов, нужно впереди ставить обратную черту: <variablelist>
 
677
 
 
678
<varlistentry>
 
679
<term
 
680
><userinput
 
681
>\</userinput
 
682
> (обратная черта)</term>
 
683
<listitem
 
684
><para
 
685
>С него должны начинаться все спецсимволы.</para
 
686
></listitem>
 
687
</varlistentry>
 
688
 
 
689
<varlistentry>
 
690
<term
 
691
><userinput
 
692
>^</userinput
 
693
></term>
 
694
<listitem
 
695
><para
 
696
>Проверка на начало строки.</para
 
697
></listitem>
 
698
</varlistentry>
 
699
 
 
700
<varlistentry>
 
701
<term
 
702
><userinput
 
703
>$</userinput
 
704
></term>
 
705
<listitem
 
706
><para
 
707
>Проверка на конец строки.</para
 
708
></listitem>
 
709
</varlistentry>
 
710
 
 
711
<varlistentry>
 
712
<term
 
713
><userinput
 
714
>()</userinput
 
715
> (левая и правая круглые скобки)</term>
 
716
<listitem
 
717
><para
 
718
>Объявление вложенного шаблона.</para
 
719
></listitem>
 
720
</varlistentry>
 
721
 
 
722
<varlistentry>
 
723
<term
 
724
><userinput
 
725
>{}</userinput
 
726
> (левая и правая фигурные скобки)</term>
 
727
<listitem
 
728
><para
 
729
>Объявление числового квантора.</para
 
730
></listitem>
 
731
</varlistentry>
 
732
 
 
733
<varlistentry>
 
734
<term
 
735
><userinput
 
736
>[]</userinput
 
737
> (левая и правая квадратные скобки)</term>
 
738
<listitem
 
739
><para
 
740
>Объявление символьного класса.</para
 
741
></listitem>
 
742
</varlistentry>
 
743
 
 
744
<varlistentry>
 
745
<term
 
746
><userinput
 
747
>|</userinput
 
748
> (вертикальная черта)</term>
 
749
<listitem
 
750
><para
 
751
>Логическое ИЛИ. Используется для разделения альтернатив.</para
 
752
></listitem>
 
753
</varlistentry>
 
754
 
 
755
<varlistentry>
 
756
<term
 
757
><userinput
 
758
>+</userinput
 
759
> (плюс)</term>
 
760
<listitem
 
761
><para
 
762
>Квантор <quote
 
763
>один или более</quote
 
764
>.</para
 
765
></listitem>
 
766
</varlistentry>
 
767
 
 
768
<varlistentry>
 
769
<term
 
770
><userinput
 
771
>*</userinput
 
772
> (звездочка)</term>
 
773
<listitem
 
774
><para
 
775
>Квантор <quote
 
776
>ноль или более</quote
 
777
>.</para
 
778
></listitem>
 
779
</varlistentry>
 
780
 
 
781
<varlistentry>
 
782
<term
 
783
><userinput
 
784
>?</userinput
 
785
> (знак вопроса)</term>
 
786
<listitem
 
787
><para
 
788
>Необязательный символ. Можно считать его квантором <quote
 
789
>ноль или один</quote
 
790
>.</para
 
791
></listitem>
 
792
</varlistentry>
 
793
 
 
794
</variablelist>
 
795
 
 
796
</para>
 
797
 
 
798
</sect2>
 
799
 
 
800
</sect1>
 
801
 
 
802
<sect1 id="quantifiers">
 
803
<title
 
804
>Кванторы</title>
 
805
 
 
806
<para
 
807
><emphasis
 
808
>Кванторы</emphasis
 
809
> выполняют проверку на определённое количество повторений символа, шаблона или символьного класса.</para>
 
810
 
 
811
<para
 
812
>Кванторы записываются в фигурных скобках (<literal
 
813
>{</literal
 
814
> и <literal
 
815
>}</literal
 
816
>). Общий вид квантора: <literal
 
817
>{[минимальное-количество-совпадений][,[максимальное-количество-совпадений]]}</literal
 
818
> </para>
 
819
 
 
820
<para
 
821
>Использование кванторов лучше пояснить на примерах: <variablelist>
 
822
 
 
823
<varlistentry>
 
824
<term
 
825
><userinput
 
826
>{1}</userinput
 
827
></term>
 
828
<listitem
 
829
><para
 
830
>Ровно одно появление</para
 
831
></listitem>
 
832
</varlistentry>
 
833
 
 
834
<varlistentry>
 
835
<term
 
836
><userinput
 
837
>{0,1}</userinput
 
838
></term>
 
839
<listitem
 
840
><para
 
841
>Ноль или одно появление</para
 
842
></listitem>
 
843
</varlistentry>
 
844
 
 
845
<varlistentry>
 
846
<term
 
847
><userinput
 
848
>{,1}</userinput
 
849
></term>
 
850
<listitem
 
851
><para
 
852
>То же самое, но набирать меньше ;)</para
 
853
></listitem>
 
854
</varlistentry>
 
855
 
 
856
<varlistentry>
 
857
<term
 
858
><userinput
 
859
>{5,10}</userinput
 
860
></term>
 
861
<listitem
 
862
><para
 
863
>Как минимум 5 повторений, максимум - 10.</para
 
864
></listitem>
 
865
</varlistentry>
 
866
 
 
867
<varlistentry>
 
868
<term
 
869
><userinput
 
870
>{5,}</userinput
 
871
></term>
 
872
<listitem
 
873
><para
 
874
>Как минимум 5 повторений (без верхней границы).</para
 
875
></listitem>
 
876
</varlistentry>
 
877
 
 
878
</variablelist>
 
879
 
 
880
</para>
 
881
 
 
882
<para
 
883
>Также определены несколько сокращений: <variablelist>
 
884
 
 
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>
 
897
 
 
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>
 
910
 
 
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>
 
923
 
 
924
</variablelist>
 
925
 
 
926
</para>
 
927
 
 
928
<sect2>
 
929
 
 
930
<title
 
931
>Жадность</title>
 
932
 
 
933
<para
 
934
>Используя кванторы без ограничений максимума, регулярное выражение захватывает строку по максимуму, такое поведение называется <emphasis
 
935
>жадным</emphasis
 
936
>.</para>
 
937
 
 
938
<para
 
939
>Современные анализаторы позволяют определять как жадные, так и нежадные регулярные выражения. В основном, это проявляется в соответствующих элементах графического интерфейса, например, в диалоге поиска может быть опция <quote
 
940
>Минимальное совпадение</quote
 
941
>.</para>
 
942
 
 
943
</sect2>
 
944
 
 
945
<sect2>
 
946
<title
 
947
>Примеры использования</title>
 
948
 
 
949
<para
 
950
>Здесь приведено несколько примеров использования кванторов.</para>
 
951
 
 
952
<variablelist>
 
953
 
 
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>
 
972
 
 
973
<varlistentry>
 
974
<term
 
975
><userinput
 
976
>\s+</userinput
 
977
></term>
 
978
<listitem
 
979
><para
 
980
>Проверка на один или более пробельных символов.</para
 
981
></listitem>
 
982
</varlistentry>
 
983
 
 
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>
 
1002
 
 
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>
 
1021
 
 
1022
</variablelist>
 
1023
 
 
1024
</sect2>
 
1025
 
 
1026
</sect1>
 
1027
 
 
1028
<sect1 id="assertions">
 
1029
<title
 
1030
>Утверждения</title>
 
1031
 
 
1032
<para
 
1033
><emphasis
 
1034
>Утверждения</emphasis
 
1035
> накладывают дополнительные условия на проверку регулярного выражения.</para>
 
1036
 
 
1037
<para
 
1038
>Утверждение не проверяет символы, скорее, оно анализирует совпавшую строку перед тем как подтвердить совпадение. Например, утверждение <emphasis
 
1039
>граница слова</emphasis
 
1040
> не пытается найти символ-разделитель слов, наоборот, оно проверяет, что в данной позиции нет алфавитно-цифрового символа. Это означает, что утверждение будет верно даже в случае отсутствия символа-разделителя, например, в конце строки поиска.</para>
 
1041
 
 
1042
<para
 
1043
>Некоторые утверждения являются шаблонами, но они лишь проверяют, есть или нет в данном месте строки совпадение заданному шаблону, не включая его в конечный результат (т.е. в "совпавший текст").</para>
 
1044
 
 
1045
<para
 
1046
>Регулярные выражения, описанные в этом руководстве, поддерживают следующие утверждения: <variablelist>
 
1047
 
 
1048
<varlistentry
 
1049
 
1050
<term
 
1051
><userinput
 
1052
>^</userinput
 
1053
> (начало строки)</term
 
1054
 
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>
 
1070
 
 
1071
<varlistentry>
 
1072
<term
 
1073
><userinput
 
1074
>$</userinput
 
1075
> (конец строки)</term>
 
1076
<listitem
 
1077
><para
 
1078
>Проверка на конец строки поиска.</para>
 
1079
 
 
1080
<para
 
1081
>Выражение <userinput
 
1082
>ты\?$</userinput
 
1083
> совпадёт с последним <quote
 
1084
>ты</quote
 
1085
> в строке <quote
 
1086
>- Ты не сделаешь этого! - А ты?</quote
 
1087
>, но не совпадёт ни с какой частью строки <quote
 
1088
>Ты не сделал этого, так?</quote
 
1089
>.</para>
 
1090
 
 
1091
</listitem>
 
1092
</varlistentry>
 
1093
 
 
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>
 
1115
 
 
1116
</varlistentry>
 
1117
 
 
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>
 
1140
 
 
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>
 
1163
 
 
1164
<varlistentry>
 
1165
<term
 
1166
><userinput
 
1167
>(?!ШАБЛОН)</userinput
 
1168
> (отрицающий просмотр)</term>
 
1169
 
 
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>
 
1191
 
 
1192
</variablelist>
 
1193
 
 
1194
</para>
 
1195
 
 
1196
</sect1>
 
1197
 
 
1198
<!-- TODO sect1 id="backreferences">
 
1199
 
 
1200
<title
 
1201
>Back References</title>
 
1202
 
 
1203
<para
 
1204
></para>
 
1205
 
 
1206
</sect1 -->
 
1207
 
 
1208
</appendix>