-
Notifications
You must be signed in to change notification settings - Fork 79
/
Copy pathpattern.differences.xml
154 lines (152 loc) · 6.84 KB
/
pattern.differences.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
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 96c9d88bad9a7d7d44bfb7f26c226df7ee9ddf26 Maintainer: takagi Status: ready -->
<!-- CREDITS: hirokawa,haruki -->
<article xml:id="reference.pcre.pattern.differences" xmlns="http://docbook.org/ns/docbook">
<title>Perl との違い</title>
<titleabbrev>Perl とは異なる点</titleabbrev>
<para>
Perl 5.005 との違いについて以下に説明します。
<orderedlist>
<listitem>
<simpara>
デフォルトでは、空白文字は C ライブラリ関数 isspace()
が認識する文字となります。PCRE を別の文字型テーブルを用いて
コンパイルすることも可能です。通常、isspace() はスペース、改ページ、
改行、復帰、水平タブ、垂直タブにマッチします。 Perl 5 では、現在、
垂直タブが空白文字として扱われていません。 Perl ドキュメントには \v
というエスケープが記載されていましたが、実際は認識されていませんでした。
ただし、垂直タブ文字は少なくとも 5.002 までは空白文字として
処理されていました。 5.004 および 5.005 では、\s
にマッチしなくなっています。
</simpara>
</listitem>
<listitem>
<simpara>
PCRE では、先読み言明に量指定子を指定できません。Perl
では可能ですが、思ったような動作を意味しないかもしれません。
例えば、(?!a){3} は、続く 3 文字が "a" でないことの言明ではありません。
この指定は、次の 1 文字が "a" ではないことを 3 回言明するだけです。
</simpara>
</listitem>
<listitem>
<simpara>
否定の先読み言明の中に記述したキャプチャ用サブパターンは
カウントされますが、対応するオフセットにそのエントリは
セットされません。 Perlでは、言明のマッチングに失敗する前に
マッチしたパターンからその変数を設定しますが、それが行われるのは、
否定の先読み言明中の選択肢が 1 つだけの場合のみです。
</simpara>
</listitem>
<listitem>
<simpara>
ヌル文字は、検索対象文字列においては使用できますが、
パターン文字列内では使用できません。これは、パターン文字列が 0
を終端とする通常の C 文字列として渡されるためです。パターン中では、
エスケープシーケンス "\x00" を使ってヌル文字を表すことができます。
</simpara>
</listitem>
<listitem>
<simpara>
次の Perl エスケープシーケンスはサポートされせん。
\l, \u, \L, \U。
これらのエスケープシーケンスは、Perl のパターンマッチエンジン内
ではなく、文字列処理の部分で実装されているためです。
</simpara>
</listitem>
<listitem>
<simpara>
Perl の \G 言明は、単一のパターンマッチに対しては意味がなく、
サポートされません。
</simpara>
</listitem>
<listitem>
<simpara>
当然ながら、PCRE により、(?{code}) 構文および (??{code})
構文はサポートされません。しかし、再帰的なパターンはサポートしています。
</simpara>
</listitem>
<listitem>
<simpara>
Perl 5.005_02 では、パターンの一部を繰り返すと、キャプチャ文字列の
セットに関して奇妙な動作をすることがあるようです。例えば、"aba"
を パターン /^(a(b)?)+$/ に対してマッチングを行うと、 $2 には値
"b" が設定されますが、"aabbaa" を /^(aa(bb)?)+$/ に対して
マッチングを行うと、$2 はセットされません。
しかし、パターンを /^(aa(b(b))?)+$/ に変えると、
$2 (および $3) はセットされます。
Perl 5.004 では、どちらの場合も $2 はセットされます。 PCRE の場合も、
どちらの場合でもセットされます。将来的に Perl が矛盾のない状態に
変更された場合は、PCRE も追従する可能性があります。
</simpara>
</listitem>
<listitem>
<simpara>
他の未解決の食い違いとして、パターン /^(a)?(?(1)a|b)+$/ は、
Perl 5.005_02 では文字列 "a" にマッチしますが、PCRE ではマッチしない
ということがあります。しかし、Perl と PCRE のいずれでも、/^(a)?a/
で "a" をマッチした場合は $1 が未定義のままとなります。
</simpara>
</listitem>
<listitem>
<para>
PCRE では、Perl の正規表現の機能よりさらに拡張された機能を使うことができます。
<orderedlist>
<listitem>
<simpara>
戻り読み言明は、固定長の文字列にマッチする必要がありますが、
このとき、戻り読み言明内の選択肢は、それぞれ異なる長さの文字列に
マッチするパターンとしても問題ありません。Perl 5.005 では
すべての選択肢が同じ長さである必要があります。
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="reference.pcre.pattern.modifiers">PCRE_DOLLAR_ENDONLY</link>
が設定され
<link linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link>
が設定されていない場合、メタ文字 $ は文字列の終端にのみ
マッチします。
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="reference.pcre.pattern.modifiers">PCRE_EXTRA</link>
を設定すると、バックスラッシュの後に意味がない文字が続くと
エラーとなります。
</simpara>
</listitem>
<listitem>
<simpara>
<link linkend="reference.pcre.pattern.modifiers">PCRE_UNGREEDY</link>
を設定すると、量指定子の貪欲さが反転します。つまり、量指定子は、
デフォルトで貪欲でなく、疑問符を後ろに付けてはじめて
貪欲になるようになります。
</simpara>
</listitem>
</orderedlist>
</para>
</listitem>
</orderedlist>
</para>
</article>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->