Revision: 218
Author: lgg860911
Date: Sun Aug 14 00:44:38 2011
Log: 提交pcre语法xml翻译
http://code.google.com/p/phpdoc-zh/source/detail?r=218
Added:
/trunk/xml/reference/pcre/pattern.syntax.xml
=======================================
--- /dev/null
+++ /trunk/xml/reference/pcre/pattern.syntax.xml Sun Aug 14 00:44:38 2011
@@ -0,0 +1,1670 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- $Revision: 307521 $ -->
+<!-- splitted from ./en/functions/pcre.xml, last change in rev 1.2 -->
+<chapter xml:id="reference.pcre.pattern.syntax"
xmlns="
http://docbook.org/ns/docbook">
+ <title>模式语法</title>
+ <titleabbrev>PCRE正则语法</titleabbrev>
+
+ <section xml:id="regexp.introduction">
+ <title>简介</title>
+ <para>
+ 下面描述的是PCRE支持的正则表达式语法和语义. 正则表达式在perl的文档
+ 和另外一些书籍中也有讨论, 其中一些会有丰富的示例. O'Reilly(ISBN
1-56592-257-3)
+ 出版的Jeffrey Friedl的 "精通正则表达式"一书非常详细的讨论了这些内容.
+ 这里的描述仅作为一个参考手册.
+ </para>
+ <para>
+ 正则表达式是一个从左到右匹配目标字符串的模式. 大多数字符自身就代表一个匹
配
+ 它们自身的模式. 作为一个简单的例子 , 模式<literal>The quick brown
fox</literal>
+ 匹配目标字符串中与其相同的部分.
+ </para>
+ </section>
+ <section xml:id="regexp.reference.delimiters">
+ <title>分隔符</title>
+ <para>
+ 当使用PCRE函数的时候, 模式需要由<emphasis>分隔符</emphasis>闭合包裹. 分隔
符
+ 可以使任意非字母数字, 非反斜线, 非空白字符.
+ </para>
+ <para>
+ 经常使用的分隔符是正斜线(<literal>/</literal>), hash符号
(<literal>#</literal>)
+ 以及取反符号(<literal>~</literal>). 下面的例子都是使用合法分隔符的模式.
+ <informalexample>
+ <programlisting>
+<![CDATA[
+/foo bar/
+#^[^0-9]$#
++php+
+%[a-zA-Z0-9_-]%
+]]>
+ </programlisting>
+ </informalexample>
+ </para>
+ <para>
+ 如果分隔符需要在模式内进行匹配, 它必须使用反斜线进行转义. 如果分隔符经常
在
+ 模式内出现, 一个更好的选择就是是用其他分隔符来提高可读性.
+ <informalexample>
+ <programlisting>
+<![CDATA[
+/http:\/\//
+#http://#
+]]>
+ </programlisting>
+ </informalexample>
+ 需要将一个字符串放入模式中使用时, 可以用
<function>preg_quote</function>函数对其进行
+ 转义, 它的第二个参数(可选)可以用于指定需要被转义的分隔符.
+ </para>
+ <para>
+ 除了上面提到的分隔符, 也可以使用括号样式的分隔符, 左括号和右括号分别作为
开始和结束
+ 分隔符.
+ <informalexample>
+ <programlisting>
+<![CDATA[
+{this is a pattern}
+]]>
+ </programlisting>
+ </informalexample>
+ </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>.
+ </para>
+ <para>
+ 共有两种不同的元字符: 一种是可以在模式中方括号外任何地方使用的, 另外一种
+ 是需要在方括号内使用的.
+ 在方括号外使用的元字符如下:
+ <variablelist>
+ <varlistentry>
+ <term><emphasis>\</emphasis></term>
+ <listitem><simpara>一般用于转义字符</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>^</emphasis></term>
+ <listitem><simpara>断言目标的开始位置(或在多行模式下是行首
)</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>$</emphasis></term>
+ <listitem><simpara>断言目标的结束位置(或在多行模式下是行尾
)</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>.</emphasis></term>
+ <listitem><simpara>匹配除换行符外的任何字符(默认)</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>[</emphasis></term>
+ <listitem><simpara>开始字符类定义</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>]</emphasis></term>
+ <listitem><simpara>结束字符类定义</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>|</emphasis></term>
+ <listitem><simpara>开始一个可选分支</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>(</emphasis></term>
+ <listitem><simpara>子组的开始标记</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>)</emphasis></term>
+ <listitem><simpara>子组的结束标记</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>?</emphasis></term>
+ <listitem>
+ <simpara>
+ 作为量词, 表示0次或1次匹配. 位于量词后面用于改变量词的贪婪特性.
+ (查阅<link linkend="regexp.reference.repetition">量词</link>)
+ </simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>*</emphasis></term>
+ <listitem><simpara>量词, 0次或多次匹配</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>+</emphasis></term>
+ <listitem><simpara>量词, 1次或多次匹配</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>{</emphasis></term>
+ <listitem><simpara>自定义量词开始标记</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>}</emphasis></term>
+ <listitem><simpara>自定义量词结束标记</simpara></listitem>
+ </varlistentry>
+ </variablelist>
+ 模式中方括号内的部分称为"字符类". 在一个字符类中仅有以下可用元字符:
+
+ <variablelist>
+ <varlistentry>
+ <term><emphasis>\</emphasis></term>
+ <listitem><simpara>转义字符</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>^</emphasis></term>
+ <listitem><simpara>仅在作为第一个字符(方括号内)时, 表明字符类取反
</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>-</emphasis></term>
+ <listitem><simpara>标记字符范围</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>]</emphasis></term>
+ <listitem><simpara>字符类结束符</simpara></listitem>
+ </varlistentry>
+ </variablelist>
+ 下面部分描述每个元字符的用法.
+ </para>
+ </section>
+
+ <section xml:id="regexp.reference.escape">
+ <title>转义序列(反斜线)</title>
+ <para>
+ 反斜线有多种用法. 首先, 如果紧接着是一个非字母数字字符, 表明取消
+ 该字符所代表的特殊涵义. 这种将反斜线作为转义字符的用法在字符类
+ 内部和外部都可用.
+ </para>
+ <para>
+ 比如, 如果你希望匹配一个"*"字符, 就需要在模式中写为"\*".
+ 这适用于一个字符在不进行转义会有特殊含义的情况下. 但是,
+ 对于非数字字母的字符, 总是在需要其进行原文匹配的时候在它前面增加一个反斜
线,
+ 来声明它代表自己, 这是安全的. 如果要匹配一个反斜线, 那么在模式中使用”\\”.
+ </para>
+ <note>
+ <para>
+ 反斜线在单引号字符串和双引号<link
+ linkend="language.types.string.syntax">字符串</link>
+ 中都有特殊含义, 因此要匹配一个反斜线,
+ 模式中必须写为”\\\\”. 译注: “/\\/”, 首先它作为字符串, 反斜线会进行转义,
+ 那么转义后的结果是/\/, 这个才是正则表达式引擎拿到的模式,
+ 而正则表达式引擎也认为\是转义标记, 它会将分隔符/进行转义,
+ 从而得到的是一个错误, 因此, 需要4个反斜线才可以匹配一个反斜线.
+ </para>
+ </note>
+ <para>
+ 如果一个模式被使用<link
linkend="reference.pcre.pattern.modifiers">PCRE_EXTENDED</link>选项编译,
+ 模式中的空白字符(除了字符类中的)和未转义的#到行末的所有字符都会被忽略.
+ 要在这种情况下使用空白字符或者#, 就需要对其进行转义.
+ </para>
+ <para>
+ 反斜线的第二种用途提供了一种对非打印字符进行可见编码的控制手段.
+ 除了二进制的0会终结一个模式外, 并不会严格的限制非打印字符(自身)的出现,
+ 但是当一个模式以文本编辑器的方式编辑准备的时候,
+ 使用下面的转义序列相比使用二进制字符会更加容易.
+ </para>
+ <para>
+ <variablelist>
+ <varlistentry>
+ <term><emphasis>\a</emphasis></term>
+ <listitem>
+ <simpara>响铃字符(十六进制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>转义 (十六进制 1B)</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\f</emphasis></term>
+ <listitem>
+ <simpara>换页 (十六进制 0C)</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\n</emphasis></term>
+ <listitem>
+ <simpara>换行 (十六进制 0A)</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\p{xx}</emphasis></term>
+ <listitem>
+ <simpara>
+ 一个符合xx属性的字符, 详细查看<link
linkend="regexp.reference.unicode">unicode properties</link> 属性
+ </simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\P{xx}</emphasis></term>
+ <listitem>
+ <simpara>
+ 一个不符合xx属性的字符, 详细查看<link
linkend="regexp.reference.unicode">unicode properties</link> 属性
+ </simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\r</emphasis></term>
+ <listitem>
+ <simpara>回车 (十六进制 0D)</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\t</emphasis></term>
+ <listitem>
+ <simpara>水平制表符 (十六进制 09)</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\xhh</emphasis></term>
+ <listitem>
+ <simpara>
+ hh十六进制编码的字符, 详细查看<link
linkend="regexp.reference.unicode">unicode properties</link> 属性
+ </simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\ddd</emphasis></term>
+ <listitem>
+ <simpara>ddd八进制编码的字符, 或者后向引用</simpara>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ <para>
+ <literal>\cx</literal>的确切效果如下: 如果<literal>x</literal>是一个小写
字母, 它被转换为大写. 接着,
+ 将字符的第6位(十六进制 40, 右数第一个位为第0位)取反.
+ 比如<literal>\cz</literal>成为十六进制的1A, <literal>\c{</literal>成为十
六进制3B,
+ <literal>\c;</literal>成为十六进制7B.
+ </para>
+ <para>
+ 在”<literal>\x</literal>”后面,读取两个十六进制数(字母可以是大写或小写).
+ 在<emphasis>UTF-8模式</emphasis>,
+ “<literal>\x{…}</literal>”允许使用, 花括号内的内容是十六进制有效数字.
+ 它将给出的十六进制数字解释为UTF-8字符代码. 原来的十六进制转义序列,
+ <literal>\xhh</literal>,
+ 匹配一个双字节的UTF-8字符, 如果它的值大于127
+ </para>
+ <para>
+ 在”<literal>\0</literal>”之后, 读取两个八进制数. 所有情况下, 如果数少于
2个, 则直接使用.
+ 序列”<literal>\0\x\07</literal>”指定了两个二进制0紧跟着一个BEL字符.
+ 请确保初始的0之后的两个数字是合法的八进制数.
+ </para>
+ <para>
+ 处理一个反斜线紧跟着的不是0的数字的情况比较复杂. 在字符类外部,
+ PCRE读取它并以十进制读取紧随其后的数字. 如果数值小于10,
+ 或者之前捕获到了该数字能够代表的左括号(子组),
+ 整个数字序列被认为是<emphasis>后向引用</emphasis>.后向引用如何工作在后面
描述,
+ 接下来就会讨论括号子组.
+ </para>
+ <para>
+ 在一个字符类里面, 或者十进制数大于9并且没有那么多的子组被捕获,
+ PCRE重新读取反斜线后的第三个8进制数字, 并且从最低的8位生成单字节值.
+ 任何的后续数字都代表它们自身. 例如:
+ </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(因为每次最多只读取3个8进制位
</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\113</emphasis></term>
+ <listitem>
+ <simpara>
+ 八进制113代表的字符
+ </simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\377</emphasis></term>
+ <listitem><simpara>8进制377是10进制255, 因此代表一个全1的字符
</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\81</emphasis></term>
+ <listitem>
+ <simpara>
+ 一个后向引用或者一个二进制0紧跟着两个数字8和1(因为8不是8进制有效数字)
+ </simpara>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ <para>
+ 注意, 八进制值的100或者更大的值必须没有前置的0引导,
+ 因为每次最多读取3个8进制位.
+ </para>
+ <para>
+ 所有序列定义的单字节值都可以在字符类内部或外部使用. 另外, 在字符类中,
+ 序列”<literal>\b</literal>”解释为退格字符. 字符类外它又有不同的意义(下面
有描述)
+ </para>
+ <para>
+ 反斜线的第三种用法是用来描述特定的字符类:
+ </para>
+ <para>
+ <variablelist>
+ <varlistentry>
+ <term><emphasis>\d</emphasis></term>
+ <listitem><simpara>任意十进制数字</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\D</emphasis></term>
+ <listitem><simpara>任意非十进制数字</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\h</emphasis></term>
+ <listitem><simpara>任意水平空白字符(since PHP
5.2.4)</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\H</emphasis></term>
+ <listitem><simpara>任意非水平空白字符(since PHP
5.2.4)</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>任意垂直空白字符(since PHP
5.2.4)</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\V</emphasis></term>
+ <listitem><simpara>任意非垂直空白字符(since PHP
5.2.4)</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\w</emphasis></term>
+ <listitem><simpara>任意单词字符</simpara></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><emphasis>\W</emphasis></term>
+ <listitem><simpara>任意非单词字符</simpara></listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ <para>
+ 上面每一对转义序列都代表了完整字符集中两个不相交的部分,
+ 任意字符一定会匹配其中一个, 同时一定不会匹配另外一个.
+ </para>
+ <para>
+ 单词字符指的是任意字母, 数字, 下划线.
+ 也就是说任意可以组成perl<emphasis>单词</emphasis>的字符.
+ 字母和数字的定义通过PCRE字符表控制, 可以通过指定地域设置使其匹配改变. 比
如,
+ 在法国(fr)地域设置中, 一些超过128的字符代码被用于重音字母,
+ 它们可以实用<literal>\w</literal>匹配.
+ </para>
+ <para>
+ 这些字符类序列在字符类内部或外部都可以出现.
+ 他们每次匹配所代表的字符类型中的一个字符. 如果当前匹配点位于目标字符串末
尾,
+ 它们中的所有字符都匹配失败, 因为没有字符让它们匹配了.
+ </para>
+ <para>
+ 反斜线的第四种用法是一些简单的断言.
+ 一个断言指定一个必须在特定位置匹配的条件,
+ 它们不会从目标字符串中消耗任何字符.
+ 接下来我们会讨论使用子组的更加复杂的断言. 反斜线断言包括:
+ </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>”在字符类中有
不同的意义,
+ 表示的是退格(backspace)字符)
+ </para>
+ <para>
+ 一个单词边界表示的是在目标字符串中,
+ 当前字符和前一个字符不同时匹配<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>断言不同于传统的<literal>^</literal>和
<literal>$</literal>(详见下文),
+ 因为他们永远匹配目标字符串的开始和结尾, 而不会受模式修饰符的限制.
+ 它们不受<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>断言在指定了<parameter>$offset</parameter>参数的
<function>preg_match()</function>调用中,
+ 仅在当前匹配位置在匹配开始点的时候才是成功的.
+ 当<parameter>$offset</parameter>的值不为0的时候,
+ 它与<literal>\A</literal>是不同的. 译注: 另外一点与
<literal>\A</literal>的不同之处在于使用preg_match_all()时,
+ 每次匹配<literal>\G</literal>只是断言是否是匹配结果的开始位置,
+ 而<literal>\A</literal>断言的则是匹配结果的开始位置是否在目标字符串开始位
置
+ </para>
+
+ <para>
+ 自php4.3.3开始, <literal>\Q</literal>和<literal>\E</literal>可以用于在模
式中忽略正则表达式元字符. 比如:
+ <literal>\w+\Q.$.\E$</literal>会匹配一个或多个单词字符, 紧接着一个点号,
一个$, 一个点号,
+ 最后锚向字符串末尾.
+ </para>
+
+ <para>
+ 自PHP 5.2.4开始. <literal>\K</literal>可以用于重置匹配. 比如,
+ <literal>foot\Kbar</literal>匹配”footbar”,
+ 但是得到的匹配结果是”bar”. 但是, <literal>\K</literal>的使用不会干预到子
组内的内容,
+ 比如<literal>(foot)\Kbar<literal>匹配”footbar”, 第一个子组内的结果仍然会
是”foo”. 译注:
+ \K放在子组和子组外面的效果是一样的.
+ </para>
+
+ </section>
+
+ <section xml:id="regexp.reference.unicode">
+ <title>Unicode字符属性</title>
+ <para>
+ 自从PHP 4.4.0和5.1.0,
+ 三个额外的转义序列在选用<emphasis>UTF-8模式</emphasis>时用于匹配通用字符
类型. 他们是:
+ </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通常的类别属性.
+ 每个字符都有一个这样的确定的属性, 通过两个缩写的字母指定. 为了与perl兼容,
+ 可以在左花括号{后面增加^表示取反. 比如:
+ <literal>\p{^Lu}</literal>就等同于<literal>\P{Lu}</literal>
+ </para>
+ <para>
+ 如果通过<literal>\p</literal>或<literal>\P</literal>仅指定了一个字母, 它
包含所有以这个字母开头的属性.
+ 在这种情况下, 花括号的转义序列是可选的.
+ </para>
+ <informalexample>
+ <programlisting>
+<![CDATA[
+\p{L}
+\pL
+]]>
+ </programlisting>
+ </informalexample>
+ <table>
+ <title>支持的Unicode属性</title>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Property</entry>
+ <entry>Matches</entry>
+ <entry>Notes</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>
+ Includes the following properties: <literal>Ll</literal>,
+ <literal>Lm</literal>, <literal>Lo</literal>, <literal>Lt</literal>
and
+ <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>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>
+ “Greek”, “InMusicalSymbols”等扩展属性在PCRE中不支持
+ </para>
+ <para>
+ 指定大小写不敏感匹配对这些转义序列不会产生影响, 比如,
+ <literal>\p{Lu}</literal>始终匹配大写字母.
+ </para>
+ <para>
+ <literal>\X</literal>转义匹配任意数量的Unicode字符.
+ <literal>\X</literal>等价于<literal>(?>\PM\pM*)</literal>
+ </para>
+ <para>
+ 也就是说, 它匹配一个没有”mark”属性的字符, 紧接着任意多个由”mark”属性的字
符.
+ 并将这个序列认为是一个原子组(详见下文).
+ 典型的有”mark”属性的字符是影响到前面的字符的重音符.
+ </para>
+ <para>
+ 用Unicode属性来匹配字符并不快,
+ 因为PCRE需要去搜索一个包含超过15000字符的数据结构.
+ 这就是为什么在PCRE中要使用传统的转义序列<literal>\d</literal>,
+ <literal>\w</literal>而不使用Unicode属性的原因.
+ </para>
+ </section>
+
+ <section xml:id="regexp.reference.anchors">
+ <title>锚</title>
+ <para>
+ 在一个字符类外面, 在默认匹配模式下,
+ <literal>^</literal>是一个断言当前匹配点位于目标字符串开始处的断言. 在一
个字符类内部,
+ <literal>^</literal>表明这个字符类中描述的字符取反(详见下文).
+ </para>
+ <para>
+ <literal>^</literal>并不一定要是模式的第一个字符, 但是如果处于某个可选分
支时,
+ 它应该是该分支的首字符. 如果所有选择分支都以<literal>^</literal>开头, 这
就是说,
+ 如果模式限制为只匹配目标的开头,
+ 它被称为是一个”紧固”模式.(同样也有其他方式可以构造出紧固模式)
+ </para>
+ <para>
+ <literal>$</literal>是用于断言当前匹配点位于目标字符串末尾,
+ 或当目标字符串以换行符结尾时当前匹配点位于该换行符位置(默认情况).
+ <literal>$</literal>不一定要作为模式的最后一个字符, 但是如果它在某个可选
分支中时,
+ 就应该位于该分支的末尾. <literal>$</literal>在字符类中没有特殊的意义.
+ </para>
+ <para>
+ <literal>$</literal>的意义可以通过在编译或匹配时设置<link
linkend="reference.pcre.pattern.modifiers">PCRE_DOLLAR_ENDONLY</link>改变为
只匹配字符串末尾.
+ 这不会影响\Z断言的行为.
+ </para>
+ <para>
+ <literal>^</literal>和<literal>$</literal>字符的意义在<link
linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link>选项被设置时
会发生变化. 当在这种情况下时,
+ 它们匹配每一个换行符后面的和前面的字符, 另外,
+ 也会匹配目标字符串的开始和结束. 比如,
+ 模式/^abc$/在多行模式下会成功匹配目标字符串”def\nabc”,
+ 而正常情况下不会.因此, 由于所有的可选分支都以^开始,
+ 在单行模式下这成为紧固模式, 然而在多行模式下, 这是非紧固的.
+ <link
linkend="reference.pcre.pattern.modifiers">PCRE_DOLLAR_ENDONLY</link>选项在
<link linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link>设置后
失效.
+ </para>
+ <para>
+ 注意: \A, \Z,
+ \z等转义序列可以在任何模式下用于匹配目标字符串的开始和结束位置.
+ 并且如果模式的所有分支都以\A开始, 它同样是紧固的,
+ 而与<link
linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link>
+ 是否设置无关.
+ </para>
+ </section>
+
+ <section xml:id="regexp.reference.dot">
+ <title>句点</title>
+ <para>
+ 在字符类外部, 模式中的句点匹配目标字符串中的任意字符, 包括非打印字符,
+ 但是(默认)不包括换行符. 如果<link
linkend="reference.pcre.pattern.modifiers">PCRE_DOTALL</link> 被设置, 句点就
会匹配换行符.
+ 句点的处理和^, $的处理没有关联, 它们唯一的关系是它们都涉及到了换行符.
+ 句点在字符类中没有任何意义.
+ </para>
+ <para>
+ <emphasis>\C</emphasis>可以被用于匹配单字节,
+ 也就是说在<emphasis>UTF-8</emphasis>模式下, 句点可以匹配多字节字符.
+ </para>
+ </section>
+
+ <section xml:id="regexp.reference.character-classes">
+ <title>字符类(方括号)</title>
+ <para>
+ 左方括号开始一个字符类的描述, 并以方中括号结束.
+ 单独的一个右方括号没有特殊含义. 如果一个右方括号需要作为一个字符类中的成
员,
+ 那么可以将它写在字符类的首字符处(如果使用了^取反,
+ 那么是第二个)或者使用转义符.
+ </para>
+ <para>
+ 一个字符类在目标字符串中匹配一个单独的字符;
+ 该字符必须是字符类中定义的字符集合的其中一个, 除非使用了^对字符类取反.
+ 如果^需要作为一个字符类的成员, 确保它不是该字符类的首字符,
+ 或者对其进行转义即可.
+ </para>
+ <para>
+ 例如, 字符类[aeiou]匹配所有的小写元音字母,
+ 而[^aeiou]匹配所有非元音字母的字符. 注意:
+ ^只是一个通过枚举指定那些不存在字符类之中的字符的便利符号. 而不是断言,
+ 它仍然会从目标字符串中消耗一个字符, 并且如果当前匹配点在目标字符串末尾,
+ 匹配将会失败.
+ </para>
+ <para>
+ 当大小写无关匹配被设置后, 任意字符类都同时代表大小写两种版本, 因此对于例
子,
+ 一个大小写不敏感的[aeiou]同时匹配"A"和"a",
+ 并且大小写不敏感的[^aeiou]同时不匹配
+ "A".
+ </para>
+ <para>
+ 换行符在字符类中没有任何特殊涵义, 与<link
linkend="reference.pcre.pattern.modifiers">PCRE_DOTALL</link> 或<link
linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link>选项都无关.
+ 一个字符类比如[^a]始终会匹配换行符
+ </para>
+ <para>
+ 在字符类中, 一个中划线(减号 -)可以用于指定从一个字符到另一个字符的范围.
+ 比如, [d-m]匹配d到m之间的所有字符, 这个集合时闭合的.
+ 如果中划线自身要在一个字符类中描述,
+ 它必须被转移或者出现在一个不会被解释为一个范围的位置,
+ 典型的比如字符类开始或结束位置.
+ </para>
+ <para>
+ 在一个字符范围描述后面不能使用右中括号.
+ 比如一个模式[W-]46]被解释为一个包含W和-的字符类, 后面紧跟字符串”46]”,
+ 因此它可以匹配”W46]”或”-46]”. 然而, 如果中括号是经过转义的,
+ 它将会被解释为范围的终点,
+ 因此[W-\]46]就会被解释为一个单独的包含W至]范围内所有字符以及4,6的字符类.
+ 8进制或16进制描述的中括号同样可以用于作为范围的终点.
+ </para>
+ <para>
+ 范围操作以ASCII整理排序. 它们可以用于为字符指定数值, 比如[\000-\037].
+ 如果在大小写不敏感匹配模式下使用一个包含字母的范围,
+ 则同时匹配它的大小写形式.
+ 比如[W-c]在不区分大小写匹配时等价于[][\^_`wxyzabc], 并且,
+ 如果使用了”fr”(法国)的地域设置字符表时,
+ [\xc8-xcb]将会在所有模式下匹配重音E字符.
+ </para>
+ <para>
+ 字符类\d, \D, \s, \S, \w和\W也可以出现在一个字符类中,
+ 用以将其匹配的字符类加入到新的自定义字符类中. 比如,
+ [\dABCDEF]匹配任意合法的16进制数. 用^可以很方便的制定严格的字符类,
+ 比如[^\W_]匹配任何字母或数字, 但不匹配下划线
+ </para>
+ <para>
+ 所有非字母数字字符除了\, -,
+ ^(在起始位置)以及结束的]在字符类中都是非特殊字符,
+ 没有转义也不会有危害.模式结束符在表达式中总是特殊字符, 必须进行转义.
+ </para>
+ <para>
+ perl支持POSIX字符类符号. 这种字符类使用<literal>[:</literal>和
<literal>:]</literal>闭合. PCRE同样支持这些字符类,
+ 比如, <literal>[01[:alpha:]%]</literal>匹配”0”, “1”, 任意字母或”%”. 支持
的字符类如下:
+ <table>
+ <title>Character classes</title>
+ <tgroup cols="2">
+ <tbody>
+ <row><entry><literal>alnum</literal></entry><entry>字母和数字
</entry></row>
+ <row><entry><literal>alpha</literal></entry><entry>字母</entry></row>
+ <row><entry><literal>ascii</literal></entry><entry>0 - 127的ascii字符
</entry></row>
+ <row><entry><literal>blank</literal></entry><entry>空格和水平制表符
</entry></row>
+ <row><entry><literal>cntrl</literal></entry><entry>控制字符
</entry></row>
+ <row><entry><literal>digit</literal></entry><entry>十进制数(same as
\d)</entry></row>
+ <row><entry><literal>graph</literal></entry><entry>打印字符, 不包括空
格</entry></row>
+ <row><entry><literal>lower</literal></entry><entry>小写字母
</entry></row>
+ <row><entry><literal>print</literal></entry><entry>打印字符,包含空格
</entry></row>
+ <row><entry><literal>punct</literal></entry><entry>打印字符, 不包括字
母和数字</entry></row>
+ <row><entry><literal>space</literal></entry><entry>空白字符 (比\s多垂
直制表符)</entry></row>
+ <row><entry><literal>upper</literal></entry><entry>大写字母
</entry></row>
+ <row><entry><literal>word</literal></entry><entry>单词字符(same as
\w)</entry></row>
+ <row><entry><literal>xdigit</literal></entry><entry>十六进制数字
</entry></row>
+ </tbody>
+ </tgroup>
+ </table>
+ 空白字符有HT(9), LF(10), VT(11), FF(12), CR(13), space(32). 注意,
+ 这个列表包含了垂直制表符. 这使得space不同于<literal>\s</literal>,
+ 因为它不包含垂直制表符(为了向perl兼容)
+ </para>
+ <para>
+ <literal>[:word:]</literal>是一个perl扩展, <literal>[:blank:]</literal>是
一个从Perl5.8中来的GNU扩展.
+ 另外一个perl扩展是取反, 通过前置一个<literal>^</literal>. 比如,
+ <literal>[12[:^digit:]]</literal>匹配”1”,
+ “2”或任何非数字字符
+ </para>
+ <para>
+ 在UTF-8模式, 大于128的字符值不会匹配任何POSIX字符类.
+ </para>
+ </section>
+
+ <section xml:id="regexp.reference.alternation">
+ <title>可选路径(|)</title>
+ <para>
+ 竖线字符用于分离模式中的可选路径.
+ 比如模式<literal>gilbert|Sullivan</literal>匹配”gilbert”或者”sullivan”.
+ 竖线可以在模式中出现任意多个, 并且允许有空的可选路径(匹配空字符串).
+ 匹配的处理从左到右尝试每一个可选路径, 并且使用第一个成功匹配的.
+ 如果可选路径在子组(下面定义)中,
+ 则”成功匹配”表示同时匹配了子模式中的分支以及主模式中的其他部分.
+ </para>
+ </section>
+
+ <section xml:id="regexp.reference.internal-options">
+ <title>内部选项设置</title>
+ <para>
+ <link linkend="reference.pcre.pattern.modifiers">PCRE_CASELESS</link>,
+ <link linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link>,
+ <link linkend="reference.pcre.pattern.modifiers">PCRE_DOTALL</link>,
+ <link linkend="reference.pcre.pattern.modifiers">PCRE_UNGREEDY</link>,
+ <link linkend="reference.pcre.pattern.modifiers">PCRE_EXTRA</link>,
+ <link linkend="reference.pcre.pattern.modifiers">PCRE_EXTENDED</link>
+ and
+ PCRE_DUPNAMES等模式修饰符设置可以在模式内部通过一个perl选项字符序列来设
置,
+ 语法为:(?修饰符), 可用的修饰符有:
+
+ <table>
+ <title>Internal option letters</title>
+ <tgroup cols="2">
+ <tbody>
+ <row>
+ <entry><literal>i</literal></entry>
+ <entry>for <link
linkend="reference.pcre.pattern.modifiers">PCRE_CASELESS</link></entry>
+ </row>
+ <row>
+ <entry><literal>m</literal></entry>
+ <entry>for <link
linkend="reference.pcre.pattern.modifiers">PCRE_MULTILINE</link></entry>
+ </row>
+ <row>
+ <entry><literal>s</literal></entry>
+ <entry>for <link
linkend="reference.pcre.pattern.modifiers">PCRE_DOTALL</link></entry>
+ </row>
+ <row>
+ <entry><literal>x</literal></entry>
+ <entry>for <link
linkend="reference.pcre.pattern.modifiers">PCRE_EXTENDED</link></entry>
+ </row>
+ <row>
***The diff for this file has been truncated for email.***