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