~ubuntu-branches/ubuntu/trusty/kde-l10n-uk/trusty-proposed

« back to all changes in this revision

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