forked from php/doc-ja
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpattern.syntax.xml
2507 lines (2363 loc) · 117 KB
/
pattern.syntax.xml
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
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- splitted from ./ja/functions/pcre.xml, last change in rev 1.1 -->
<!-- EN-Revision: c43393d1b64a41be1b8c45f997062b0f645bc91e Maintainer: takagi Status: ready -->
<!-- Credits: haruki,hirokawa,mumumu -->
<chapter xml:id="reference.pcre.pattern.syntax" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>パターン構文</title>
<titleabbrev>PCRE 正規表現構文</titleabbrev>
<section xml:id="regexp.introduction">
<title>はじめに</title>
<para>
PCRE がサポートする正規表現の構文と意味体系を以下に示します。
正規表現については、Perl のドキュメントや他の多くの書籍においても
解説されており、実例が豊富に記載されているものもあります。特に、
O'Reilly 発刊 Jeffrey Friedl 著 "Mastering Regular Expressions"
(ISBN 1-56592-257) 〔日本語版:「詳説 正規表現」〕には、
たいへん詳細に解説されています。
</para>
<para>
以降の説明は、参考文書 (reference documentation) として
扱われることを想定しています。
</para>
<para>
正規表現は、ある種のパターンであり、検索対象文字列 (subject string)
に対して左から右〔文字列の初めから終わり〕の順にマッチングが行われます。
一部の例外を除き、パターン中の文字はその文字自体を表し、
検索対象文字列内の同じ文字にマッチします。簡単な例をあげると、パターン
<literallayout>
The quick brown fox
</literallayout>
は、検索対象文字列内にある、このパターンと同一の部分にマッチします。
</para>
</section>
<section xml:id="regexp.reference.delimiters">
<title>デリミタ</title>
<para>
PCRE 関数を使うときには、パターンを
<emphasis>delimiters</emphasis> で囲まなければなりません。
英数字、バックスラッシュ、空白文字以外の任意の文字をデリミタとして使うことができます。
有効なデリミタの前に空白文字を付けても、黙って無視されます。
</para>
<para>
デリミタとしてよく使われる文字は、スラッシュ (<literal>/</literal>)、
ハッシュ記号 (<literal>#</literal>) およびチルダ (<literal>~</literal>) です。
次に示す例は、どれも正しいデリミタです。
<informalexample>
<programlisting>
<![CDATA[
/foo bar/
#^[^0-9]$#
+php+
%[a-zA-Z0-9_-]%
]]>
</programlisting>
</informalexample>
</para>
<para>
角括弧形式のデリミタを使うこともできます。
これは、開き角括弧と閉じ角括弧がそれぞれ開始デリミタ、終了デリミタを表す形式です。
<literal>()</literal>、
<literal>{}</literal>、<literal>[]</literal> そして <literal><></literal>
はどれも、角括弧形式のデリミタとして有効です。
<informalexample>
<programlisting>
<![CDATA[
(this [is] a (pattern))
{this [is] a (pattern)}
[this [is] a (pattern)]
<this [is] a (pattern)>
]]>
</programlisting>
</informalexample>
角括弧形式のデリミタを使う場合は、パターン内でメタ文字を使うときのエスケープは不要です。
しかし、他のデリミタと同様、(メタ文字としてではなく) リテラルとして扱う場合は、
エスケープする必要があります。
</para>
<para>
パターンの中でデリミタ文字をマッチさせたい場合は、バックスラッシュでエスケープしなければなりません。
パターン内でデリミタが頻繁にあらわれる場合は、
デリミタを別の文字に変更したほうが読みやすくなります。
<informalexample>
<programlisting>
<![CDATA[
/http:\/\//
#http://#
]]>
</programlisting>
</informalexample>
<function>preg_quote</function> 関数を使うと、パターンに使う文字列をエスケープすることができます。
オプションの二番目のパラメータで、エスケープするデリミタを指定します。
</para>
<para>
終了デリミタの後に <link linkend="reference.pcre.pattern.modifiers">
パターン修飾子</link> を付加することもできます。次の例は、大文字小文字を区別しないマッチを行うものです。
<informalexample>
<programlisting>
<![CDATA[
#[a-z]#i
]]>
</programlisting>
</informalexample>
</para>
</section>
<section xml:id="regexp.reference.meta">
<title>メタ文字</title>
<para>
正規表現の強力さは、パターン中に選択肢や繰り返しを記述できることに
あります。選択肢や繰り返しは、<emphasis>メタ文字</emphasis>
(meta-character) を使ってパターン中に記述します。メタ文字は、
その文字自体を表わさず、代わって特別な解釈が行われます。
</para>
<para>
メタ文字には、2 種類あります。ひとつは、角カッコ内を除き、
パターン中のどこででも使用できる文字です。もうひとつは、
角カッコで括られた中でだけ使用できる文字です。
</para>
<para>
前者の角カッコ外で使用できるメタ文字には、次のものがあります。
<table>
<title>角カッコ外で使用できるメタ文字</title>
<tgroup cols="2">
<thead>
<row>
<entry>メタ文字</entry><entry>説明</entry>
</row>
</thead>
<tbody>
<row>
<entry>\</entry><entry>多目的に使う一般的なエスケープ文字 </entry>
</row>
<row>
<entry>^</entry><entry>検索対象(複数行モードでは行)の始まりを言明</entry>
</row>
<row>
<entry>$</entry><entry>検索対象の終わりあるいは終端の改行文字の前(複数行モードでは行の終わり)を言明</entry>
</row>
<row>
<entry>.</entry><entry>改行を除くすべての文字にマッチ(デフォルト時)</entry>
</row>
<row>
<entry>[</entry><entry>文字クラス定義の開始</entry>
</row>
<row>
<entry>]</entry><entry>文字クラス定義の終了</entry>
</row>
<row>
<entry>|</entry><entry>選択枝の開始</entry>
</row>
<row>
<entry>(</entry><entry>サブパターンの開始</entry>
</row>
<row>
<entry>)</entry><entry>サブパターンの終了</entry>
</row>
<row>
<entry>?</entry><entry>( の意味を拡張/0 または 1 回マッチ/なるべく少ない回数だけマッチ
(<link linkend="regexp.reference.repetition">繰り返し</link> を参照)</entry>
</row>
<row>
<entry>*</entry><entry>0 回以上の繰り返し</entry>
</row>
<row>
<entry>+</entry><entry>1 回以上の繰り返し</entry>
</row>
<row>
<entry>{</entry><entry>最小/最大を指定する量指定子の開始</entry>
</row>
<row>
<entry>}</entry><entry>最小/最大を指定する量指定子の終了</entry>
</row>
</tbody>
</tgroup>
</table>
パターン中の角カッコで括まれた部分を「<link linkend="regexp.reference.character-classes">文字クラス</link>」と言います。
文字クラスで使えるメタ文字は、次のものだけです。
<table>
<title>角カッコ内のメタ文字 (<emphasis>文字クラス</emphasis>)</title>
<tgroup cols="2">
<thead>
<row>
<entry>Meta-character</entry><entry>Description</entry>
</row>
</thead>
<tbody>
<row>
<entry>\</entry><entry>一般的なエスケープ文字</entry>
</row>
<row>
<entry>^</entry><entry>クラスの否定。ただし、文字クラスの最初の文字に用いた場合のみ</entry>
</row>
<row>
<entry>-</entry><entry>文字の範囲の指定</entry>
</row>
</tbody>
</tgroup>
</table>
以降のセクションで、各メタ文字の使用法の説明を行います。
</para>
</section>
<section xml:id="regexp.reference.escape">
<title>エスケープシーケンス</title>
<para>
バックスラッシュ〔日本語環境では円記号となる場合もある〕には、
いくつかの使用法があります。ひとつめの使用法は、
非英数字の前に記述する場合で、続く文字が表す特別な意味を取り去ります。
このエスケープ文字としての使用法は、
文字クラスの内外部いずれでも可能です。
</para>
<para>
たとえば、"*" 文字とマッチさせたい場合は、パターンを "\*" と記述します。
続く文字がメタ文字として解釈されるものであるかには関係ありませんので、
いかなる非英数字に対しても、"\" を付けると、その文字自体が
表わされることになります。特に、
バックスラッシュとマッチさせたい場合は、"\\" と記述します。
</para>
<note>
<para>
シングルクォートあるいはダブルクォートで囲まれた PHP の
<link linkend="language.types.string.syntax">文字列</link>
の中では、バックスラッシュは特別な意味を表します。
そのため、正規表現 \\ を使用して \ とマッチさせたい場合は
PHP のコード内では "\\\\" あるいは '\\\\' と記述する必要があります。
</para>
</note>
<para>
パターンを、
<link linkend="reference.pcre.pattern.modifiers">PCRE_EXTENDED</link>
オプションを付けてコンパイルすると、(文字クラス内部を除き)
パターン中の空白文字、および "#" とその次の改行文字との間の文字は
無視されます。空白文字や "#" をパターン中に含めるには、
バックスラッシュを用いてエスケープします。
</para>
<para>
バックスラッシュの 2 番目の使用法は、非表示文字〔制御コードなど〕を
パターン中に目に見える形で記述するための方法です。ヌル文字は
パターンを終了させてしまうため使えませんが、その他の非表示文字は、
パターンにそのまま含めても問題はありません。しかし、パターンの編集には、
バイナリ文字をそのまま用いるよりも、以下に示すエスケープシーケンスを
用いる方が便利でしょう。
</para>
<para>
<variablelist>
<varlistentry>
<term><emphasis>\a</emphasis></term>
<listitem>
<simpara>アラーム、ベル文字 (16進 07)</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\cx</emphasis></term>
<listitem>
<simpara>"control-x", ここで x は任意の文字</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\e</emphasis></term>
<listitem>
<simpara>エスケープ文字 (16進 1B)</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\f</emphasis></term>
<listitem>
<simpara>改ページ (formfeed) (16進 0C)</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\n</emphasis></term>
<listitem>
<simpara>改行 (newline) (16進 0A)</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\p{xx}</emphasis></term>
<listitem>
<simpara>
xx プロパティを持つ文字、詳細は
<link linkend="regexp.reference.unicode">unicode プロパティ</link>
を参照
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\P{xx}</emphasis></term>
<listitem>
<simpara>
xx プロパティを持たない文字、詳細は
<link linkend="regexp.reference.unicode">unicode プロパティ</link>
を参照
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\r</emphasis></term>
<listitem>
<simpara>復帰 (carriage return) (16進 0D)</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\R</emphasis></term>
<listitem>
<simpara>改行: \n、\r、\r\n にマッチする</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\t</emphasis></term>
<listitem>
<simpara>タブ (16進 09)</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\xhh</emphasis></term>
<listitem>
<simpara>
16 進コードで hh の文字
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\ddd</emphasis></term>
<listitem>
<simpara>8 進コードで ddd の文字、もしくは、後方参照</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
"<literal>\cx</literal>" の正確な働きは、次の通りです。
"<literal>x</literal>" が小文字の場合、
大文字に変換されます。続いて、文字の 6 ビット目 (16進数 40) が
反転されます。つまり、"<literal>\cz</literal>" は 16 進数の 1A になり、
"<literal>\c{</literal>" は 3B になり、
"<literal>\c;</literal>" は 7B になります。
</para>
<para>
"<literal>\x</literal>" の後では、2 桁までの 16 進数が読まれます
(大小文字どちらも可能です)。
<emphasis>UTF-8 モード</emphasis> では、
"<literal>\x{...}</literal>" という記法も使えます。
この場合、波括弧の中身は16進数を示す文字列です。
この文字列は、16進数の数値でコードポイントを表す UTF-8 文字として解釈されます。
オリジナルの16進のエスケープシーケンス <literal>\xhh</literal> は、
値が127より大きい場合、2バイトのUTF-8 文字とマッチします。
</para>
<para>
"\0" の後では、さらに 2 桁の 8 進数が
読みこまれます。いずれの場合も、2 桁より少ない場合、桁があるだけ
読みこまれます。つまり、"<literal>\0\x\07</literal>" は
ヌル文字 2 つの後にベル文字が
続いたものを表します。8 進数を指定する場合は、必ず最初のゼロに続いて
残りの 2 桁の数字を指定するように注意してください。
</para>
<para>
バックスラッシュの後に 0 以外の数字が続く場合の処理は複雑です。
文字クラスの外部では、 PCRE は、続く数字全体を 10 進数として読みます。
数字が 10 よりも小さい場合、または、正規表現の中に含まれる
キャプチャ用左カッコの数以下の場合、
<emphasis>後方参照</emphasis> として解釈されます。
この動作に関する詳しい説明は、後ほど、カッコによるサブパターンの説明を
行ってから示します
</para>
<para>
文字クラスの中、または、指定された 10 進数が 9 より大きく、
キャプチャ用サブパターンの数がこの数に満たない場合は、PCRE は
バックスラッシュの後から最大 3 文字の 8 進数を再度読みこみ、
その値の最下位 8 ビットから 1 バイトを生成します。
その後に続く数字は、それ自体を表します。以下に例を示します。
</para>
<para>
<variablelist>
<varlistentry>
<term><emphasis>\040</emphasis></term>
<listitem>
<simpara>
スペースの別の表記法
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\40</emphasis></term>
<listitem>
<simpara>
上と同じ。ただし、キャプチャ用サブパターンが 40 個未満の場合
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\7</emphasis></term>
<listitem>
<simpara>
常に後方参照
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\11</emphasis></term>
<listitem>
<simpara>
後方参照、または、タブの別記法
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\011</emphasis></term>
<listitem>
<simpara>
常にタブ
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\0113</emphasis></term>
<listitem>
<simpara>
タブの後に文字 "3" が続いたもの
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\113</emphasis></term>
<listitem>
<simpara>
8進コードで 113 の文字
(99 を超える後方参照は存在しないため)
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\377</emphasis></term>
<listitem>
<simpara>
全ビットが 1 である 1 バイト
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\81</emphasis></term>
<listitem>
<simpara>
後方参照、または、ヌル文字の後に 2つの文字
"8" および "1" が続いたもの
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
3 桁を超えて 8 進数は読みこまれないため、100 以上の 8 進数には
ゼロを前につけてはいけないことに注意してください。
</para>
<para>
これらの 1 バイト値を定義するエスケープシーケンスは、
文字クラスの内外部のいずれでも使用できます。加えて、文字クラス内では
エスケープシーケンス "<literal>\b</literal>" はバックスペース (16進 08) として解釈されます。
文字クラス外では、別の意味を有します(別記参照)。
</para>
<para>
バックスラッシュの第 3 の使用法は、包括的な文字型を指定する用途です。
</para>
<para>
<variablelist>
<varlistentry>
<term><emphasis>\d</emphasis></term>
<listitem>
<simpara>
10 進数字
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\D</emphasis></term>
<listitem>
<simpara>
10 進数字でない文字
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\h</emphasis></term>
<listitem><simpara>水平方向の空白文字</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\H</emphasis></term>
<listitem><simpara>水平方向の空白文字でない文字</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\s</emphasis></term>
<listitem>
<simpara>
空白文字
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\S</emphasis></term>
<listitem>
<simpara>
空白文字でない文字
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\v</emphasis></term>
<listitem><simpara>垂直方向の空白文字</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\V</emphasis></term>
<listitem><simpara>垂直方向の空白文字でない文字</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\w</emphasis></term>
<listitem>
<simpara>
単語構成文字 (word character)
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\W</emphasis></term>
<listitem>
<simpara>
非単語構成文字 (non-word character)
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
これらエスケープシーケンスの各組により、文字集合が 2 つに分割されます。
文字は、各組のどちらか片方だけにマッチします。
</para>
<para>
空白文字とは HT (9)、LF (10)、FF (12)、CR (13)、スペース (32) のことです。
しかし、ロケールを指定したマッチングを行った場合には、
128から255までのコードポイントの文字
(たとえば NBSP (A0)) も空白文字とみなされる可能性があります。
</para>
<para>
単語構成文字とは、英字または数字またはアンダースコア文字であり、Perl
が定義するところの「単語」と成り得る文字のことです。文字および数字の
定義は、PCRE の文字テーブルにより制御され、ロケールを指定して
マッチングを行うと変わる可能性があります。
例えば、"fr" (フランス語)ロケールの場合、128 を超える
文字コードのいくつかは、アクセント付きの文字に使われており、
これらは <literal>\w</literal> とマッチします。
</para>
<para>
これらの文字型表記は、文字クラスの内外によらず使用可能で、
対応する型のたかだか 1 文字とマッチします。現在のマッチング位置が
検索対象文字列の終端である場合、マッチできる文字が無いので、
マッチは失敗します。
</para>
<para>
バックスラッシュの第 4 の使用法は、簡単な言明 (assertion) です。
言明とは、マッチがある特定の位置でだけ可能だという条件を指定するもので、
検索対象文字列から文字を消費 (consume)〔つまり文字自体にマッチ〕
しません。サブパターンを使ったより複雑な言明の方法もありますが、
それについての解説は後ほど行います。バックスラッシュを使った言明は、
次のものがあります
</para>
<para>
<variablelist>
<varlistentry>
<term><emphasis>\b</emphasis></term>
<listitem>
<simpara>
単語境界
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\B</emphasis></term>
<listitem>
<simpara>
非単語境界
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\A</emphasis></term>
<listitem>
<simpara>
検索対象文字列の始端(複数行モードとは独立)
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\Z</emphasis></term>
<listitem>
<simpara>
検索対象文字列の終端、または終端の改行(複数行モードとは独立)
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\z</emphasis></term>
<listitem>
<simpara>
検索対象文字列の終端(複数行モードとは独立)
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\G</emphasis></term>
<listitem><simpara>マッチングの開始位置</simpara></listitem>
</varlistentry>
</variablelist>
</para>
<para>
これらの言明は、文字クラス内では使用できません(また、文字クラス内では、
"<literal>\b</literal>" はバックスペース文字という別の意味を持つので
注意してください)。
</para>
<para>
単語境界 (word boundary) とは、検索対象文字列において、
カレントの文字およびその前の文字が同時に <literal>\w</literal>
もしくは <literal>\W</literal> にマッチしない(すなわち、片方が
<literal>\w</literal> にマッチし、もう片方が <literal>\W</literal>
にマッチする)位置、もしくは、文字列の始めか終わりで、
その始めか終わりの文字が <literal>\w</literal> にマッチする位置の
ことです。
</para>
<para>
言明 <literal>\A</literal>, <literal>\Z</literal>,
<literal>\z</literal> は、(<link linkend="regexp.reference.anchors">アンカー</link> で説明する)ハット記号やドル記号とは
異なり、オプション設定によらず、文字列の始端または終端だけに
マッチします。これらの言明は、<link
linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link> および <link
linkend="reference.pcre.pattern.modifiers">PCRE_DOLLAR_ENDONLY</link>
オプションの影響を受けません。
<literal>\Z</literal> と <literal>\z</literal> との違いは、
<literal>\Z</literal> は文字列の末尾の改行の前の位置および文字列の
終端にマッチするのに対し、<literal>\z</literal> は文字列の終端にのみ
マッチすることです。
</para>
<para>
言明 <literal>\G</literal> は、カレントのマッチング位置が、
<function>preg_match</function> 関数の <parameter>offset</parameter>
引数に指定されたマッチングの開始位置である場合に真になります。
<parameter>offset</parameter> が非ゼロの場合は、<literal>\A</literal>
と等価ではありません。
</para>
<para>
<literal>\Q</literal> と <literal>\E</literal> とを使って、
パターン中のメタ文字を無視させることができます。
たとえば、
<literal>\w+\Q.$.\E$</literal>
は、文字列の終端において1つ以上の単語構成文字のあとに <literal>.$.</literal>
というリテラルが続いたものにマッチします。
これらは、デリミタの動作を変更しないことに注意して下さい。
たとえば、<literal>#\Q#\E#$</literal> は無効なパターンです。
なぜなら、<literal>#</literal> がパターンの終端としてマークされ、
<literal>\E#</literal> が無効な修正子と解釈されるからです。
</para>
<para>
<literal>\K</literal> を使用すると、マッチの開始位置をリセットできます。
たとえば、パターン
<literal>foo\Kbar</literal> は "foobar" にマッチしますが、
結果は "bar" にマッチしたと報告されます。
<literal>\K</literal> を使用しても、キャプチャした部分文字列には影響を及ぼしません。
たとえば、パターン <literal>(foo)\Kbar</literal> が
"foobar" にマッチしたときの最初の部分文字列は "foo" です。
</para>
</section>
<section xml:id="regexp.reference.unicode">
<title>Unicode 文字プロパティ</title>
<para>
PHP 5.1.0 以降、<emphasis>UTF-8 モード</emphasis> を設定した場合に、
一般的な文字タイプにマッチする新たなエスケープシーケンスが 3 つ追加されました。
</para>
<variablelist>
<varlistentry>
<term><emphasis>\p{xx}</emphasis></term>
<listitem><simpara>xx プロパティを持つ文字</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\P{xx}</emphasis></term>
<listitem><simpara>xx プロパティを持たない文字</simpara></listitem>
</varlistentry>
<varlistentry>
<term><emphasis>\X</emphasis></term>
<listitem><simpara>拡張 Unicode シーケンス</simpara></listitem>
</varlistentry>
</variablelist>
<para>
ここで <literal>xx</literal> で表されているプロパティ名は、Unicode で
一般カテゴリプロパティ (general category properties) として規定されているものに
なります。すべての文字は、いずれかひとつのプロパティを持ちます。
プロパティは、2 文字の略語で表されます。Perl と同じく、
開き波カッコとプロパティ名との間にハット文字を記述することで否定を指定できます。
たとえば、<literal>\p{^Lu}</literal> は <literal>\P{Lu}</literal> と同じです。
</para>
<para>
<literal>\p</literal> もしくは <literal>\P</literal> の後に、一文字だけを記述すると
その文字で始まるすべてのプロパティが指定されたことになります。
この場合、否定の指定をしていない場合、波カッコを使用しなくても構いません。
以下の 2 つの例は等価になります。
</para>
<informalexample>
<programlisting>
<![CDATA[
\p{L}
\pL
]]>
</programlisting>
</informalexample>
<table>
<title>使用可能なプロパティコード</title>
<tgroup cols="3">
<thead>
<row>
<entry>プロパティ</entry>
<entry>マッチ</entry>
<entry>備考</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>C</literal></entry>
<entry>その他 (Other)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Cc</literal></entry>
<entry>コントロール文字 (Control)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Cf</literal></entry>
<entry>非可視整形用文字 (Format)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Cn</literal></entry>
<entry>未定義コードポイント (Unassigned)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Co</literal></entry>
<entry>私的利用領域 (Private use)</entry>
<entry></entry>
</row>
<row rowsep="1">
<entry><literal>Cs</literal></entry>
<entry>サロゲート (Surrogate)</entry>
<entry></entry>
</row>
<row>
<entry><literal>L</literal></entry>
<entry>アルファベット (Letter)</entry>
<entry>
<literal>Ll</literal>、
<literal>Lm</literal>、<literal>Lo</literal>、<literal>Lt</literal> および
<literal>Lu</literal> を含む
</entry>
</row>
<row>
<entry><literal>Ll</literal></entry>
<entry>小文字アルファベット (Lower case letter)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Lm</literal></entry>
<entry>擬似文字 (Modifier letter)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Lo</literal></entry>
<entry>その他の文字 (Other letter)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Lt</literal></entry>
<entry>タイトル文字 (Title case letter)</entry>
<entry></entry>
</row>
<row rowsep="1">
<entry><literal>Lu</literal></entry>
<entry>大文字アルファベット (Upper case letter)</entry>
<entry></entry>
</row>
<row>
<entry><literal>M</literal></entry>
<entry>記号 (Mark)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Mc</literal></entry>
<entry>修飾文字 (Spacing mark)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Me</literal></entry>
<entry>他の文字を囲むための文字 (Enclosing mark)</entry>
<entry></entry>
</row>
<row rowsep="1">
<entry><literal>Mn</literal></entry>
<entry>他の文字を修飾するための文字 (Non-spacing mark)</entry>
<entry></entry>
</row>
<row>
<entry><literal>N</literal></entry>
<entry>数字 (Number)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Nd</literal></entry>
<entry>10 進数字 (Decimal number)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Nl</literal></entry>
<entry>数値を表す文字 (Letter number)</entry>
<entry></entry>
</row>
<row rowsep="1">
<entry><literal>No</literal></entry>
<entry>その他の数字 (Other number)</entry>
<entry></entry>
</row>
<row>
<entry><literal>P</literal></entry>
<entry>句読記号 (Punctuation)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Pc</literal></entry>
<entry>連結用句読記号 (Connector punctuation)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Pd</literal></entry>
<entry>ダッシュ (Dash punctuation)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Pe</literal></entry>
<entry>閉じ句読記号 (Close punctuation)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Pf</literal></entry>
<entry>末尾句読記号 (Final punctuation)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Pi</literal></entry>
<entry>先頭句読記号 (Initial punctuation)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Po</literal></entry>
<entry>その他の句読記号 (Other punctuation)</entry>
<entry></entry>
</row>
<row rowsep="1">
<entry><literal>Ps</literal></entry>
<entry>開き句読記号 (Open punctuation)</entry>
<entry></entry>
</row>
<row>
<entry><literal>S</literal></entry>
<entry>記号 (Symbol)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Sc</literal></entry>
<entry>通貨記号 (Currency symbol)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Sk</literal></entry>
<entry>合わせ文字 (Modifier symbol)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Sm</literal></entry>
<entry>数学記号 (Mathematical symbol)</entry>
<entry></entry>
</row>
<row rowsep="1">
<entry><literal>So</literal></entry>
<entry>その他の記号 (Other symbol)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Z</literal></entry>
<entry>区切り文字 (Separator)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Zl</literal></entry>
<entry>行区切り文字 (Line separator)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Zp</literal></entry>
<entry>段落区切り文字 (Paragraph separator)</entry>
<entry></entry>
</row>
<row>
<entry><literal>Zs</literal></entry>
<entry>空白文字 (Space separator)</entry>
<entry></entry>
</row>
</tbody>
</tgroup>
</table>
<para>
<literal>InMusicalSymbols</literal> のような拡張プロパティ (extended properties)
を、PCRE はサポートしていません。
</para>
<para>
大小文字を区別しないマッチングを設定していても、これらのエスケープ
シーケンスには影響しません。たとえば、<literal>\p{Lu}</literal> は
常に大文字にのみマッチします。
</para>
<para>
Unicode の文字は、何らかのスクリプトに属するものとして定義されています。
スクリプト名を指定すれば、そのスクリプトの文字群の一文字にマッチさせることができます。
たとえば、次のように使います。
</para>
<itemizedlist>
<listitem>
<simpara><literal>\p{Greek}</literal></simpara>
</listitem>
<listitem>
<simpara><literal>\P{Han}</literal></simpara>
</listitem>
</itemizedlist>
<para>
どのスクリプトにも属しない文字は、ぜんぶまとめて
<literal>Common</literal> で表します。現在サポートするスクリプトは次のとおりです。
</para>
<table>
<title>サポートするスクリプト</title>
<tgroup cols="5">
<tbody>
<row>
<entry><literal>Arabic</literal></entry>
<entry><literal>Armenian</literal></entry>
<entry><literal>Avestan</literal></entry>
<entry><literal>Balinese</literal></entry>
<entry><literal>Bamum</literal></entry>
</row>
<row>
<entry><literal>Batak</literal></entry>
<entry><literal>Bengali</literal></entry>
<entry><literal>Bopomofo</literal></entry>
<entry><literal>Brahmi</literal></entry>
<entry><literal>Braille</literal></entry>
</row>
<row>
<entry><literal>Buginese</literal></entry>
<entry><literal>Buhid</literal></entry>
<entry><literal>Canadian_Aboriginal</literal></entry>
<entry><literal>Carian</literal></entry>
<entry><literal>Chakma</literal></entry>
</row>
<row>
<entry><literal>Cham</literal></entry>
<entry><literal>Cherokee</literal></entry>
<entry><literal>Common</literal></entry>
<entry><literal>Coptic</literal></entry>
<entry><literal>Cuneiform</literal></entry>
</row>
<row>
<entry><literal>Cypriot</literal></entry>
<entry><literal>Cyrillic</literal></entry>
<entry><literal>Deseret</literal></entry>
<entry><literal>Devanagari</literal></entry>
<entry><literal>Egyptian_Hieroglyphs</literal></entry>
</row>
<row>
<entry><literal>Ethiopic</literal></entry>
<entry><literal>Georgian</literal></entry>
<entry><literal>Glagolitic</literal></entry>
<entry><literal>Gothic</literal></entry>
<entry><literal>Greek</literal></entry>
</row>
<row>
<entry><literal>Gujarati</literal></entry>
<entry><literal>Gurmukhi</literal></entry>
<entry><literal>Han</literal></entry>
<entry><literal>Hangul</literal></entry>
<entry><literal>Hanunoo</literal></entry>
</row>
<row>