-
Notifications
You must be signed in to change notification settings - Fork 80
Expand file tree
/
Copy pathpattern.differences.xml
More file actions
142 lines (142 loc) · 8.23 KB
/
pattern.differences.xml
File metadata and controls
142 lines (142 loc) · 8.23 KB
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
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 96c9d88bad9a7d7d44bfb7f26c226df7ee9ddf26 Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<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>
По умолчанию пробельный символ — любой символ, который функция isspace()
из библиотеки C опознает таковым, хотя возможно скомпилировать PCRE с альтернативными
таблицами символов. Функция isspace() определяет как пробельный следующие символы:
пробел, конец страницы (formfeed), перевод строки, возврат каретки, горизонтальную
табуляцию и вертикальную табуляцию. Perl 5 же не включает вертикальную табуляцию в
список пробельных символов. Экранирование \v долгое время присутствовавшее в
документации Perl на самом деле никогда не распознавалось. Однако, символ как таковой,
считался за пробельный до версии 5.002. В 5.004 и 5.005 он не определяется как \s.
</simpara>
</listitem>
<listitem>
<simpara>
PCRE не позволяет использовать квантификаторы повторения в опережающих
предположениях. Perl разрешает, но они не означают того, о чем вы могли подумать. К
примеру, (?!a){3} не проверяет, что следующие три символа не "a". Проверяется только то,
что следующий символ не "a" три раза.
</simpara>
</listitem>
<listitem>
<simpara>
Захватывающие подшаблоны, которые возникают в отрицательных опережающих проверках
считаются, но их записи в векторе смещений никогда не устанавливаются. Perl
устанавливает числовые переменные из любых подобных масок, которые совпали до
момента, когда предположение не подтвердилось при проверке чего-либо, но только если
опережающее предположение содержит только одну ветвь.
</simpara>
</listitem>
<listitem>
<simpara>
Хотя бинарные нулевые символы поддерживаются в проверяемой строке, они недопустимы
в строке шаблона, потому что она передаётся как нормальная C-строка, в которой этот
символ обозначает конец строки. Для его использования в строке шаблона необходимо
пользоваться конструкцией "\x00".
</simpara>
</listitem>
<listitem>
<simpara>
Следующие экранирующие последовательности Perl не поддерживаются:
\l, \u, \L, \U. Фактически они реализованы стандартным обработчиком строк Perl и
не являются частью модуля обработки регулярных выражений.
</simpara>
</listitem>
<listitem>
<simpara>
Предположение \G из Perl также не поддерживается, поскольку не имеет отношения к
отдельно взятой схеме совпадений.
</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 как-либо зафиксирует это поведение, PRCE
будет ему следовать.
</simpara>
</listitem>
<listitem>
<simpara>
Другое до сих пор неразрешённое противоречие в том, что Perl 5.005_02, шаблоном
/^(a)?(?(1)a|b)+$/ распознает строку "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
-->