Diff of /trunk/doc/pattern.txt [r209] .. [r210] Maximize Restore

  Switch to side-by-side view

--- a/trunk/doc/pattern.txt
+++ b/trunk/doc/pattern.txt
@@ -1,4 +1,4 @@
-*pattern.txt*   For Vim version 7.3.  最近更新: 2011年5月
+*pattern.txt*   For Vim version 7.4.  最近更新: 2013年8月
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -309,6 +309,23 @@
 		或  \z( pattern \)		|/\z(|
 
 
+				*/\%#=* *two-engines* *NFA*
+Vim 包含两个正规表达式引擎:
+1. 老式的基于回溯的引擎,支持所有功能。
+2. 新的 NFA 引擎,对某些模式会快很多,但不支持所有功能。
+
+Vim 会自动为你选择合适的引擎。不过,如果你遇过问题或者想特别指点某一个引擎,可
+以模式开头处加入:
+
+	\%#=0	强制自动选择。仅在 'regexpengine' 设为非零时才有效果。
+	\%#=1	强制使用旧引擎。
+	\%#=2	强制使用 NFA 引擎。
+
+也可用 'regexpengine' 选项改变缺省机制。
+
+			 *E864* *E868* *E874* *E875* *E876* *E877* *E878*
+选择 NFA 引擎时如果遇到未实现的模式部分时,整个模式会不匹配。只用于调试 Vim。
+
 ==============================================================================
 3. 魔术								*/magic*
 
@@ -350,9 +367,10 @@
 
 ==============================================================================
 4. 模式项总览						*pattern-overview*
+						*E865* *E866* *E867* *E869*
 
 倍数总览。						*/multi* *E61* *E62*
-更多解释和示例见下,点击链接即可。					*E64*
+更多解释和示例见下,点击链接即可。				*E64* *E871*
 
 	  倍数 ~
      'magic' 'nomagic'	匹配前面的匹配原 ~
@@ -457,22 +475,24 @@
 	x	x	一个没有特殊含义的字符匹配其自身
 
 |/[]|	[]	\[]	[] 内指定的任何字符之一
-|/\%[]| \%[]	\%[]	一个可选匹配原的序列
+|/\%[]|	\%[]	\%[]	一个可选匹配原的序列
 
 |/\c|	\c	\c	忽略大小写,不使用 'ignorecase' 选项
 |/\C|	\C	\C	匹配大小写,不使用 'ignorecase' 选项
+|/\Z|	\Z	\Z	忽略 Unicode 中的 "组合用字符" 的区别,对于搜索带元音
+			的希伯来和阿拉伯文本有用。
+
 |/\m|	\m	\m	对之后模式中字符打开 'magic' 选项
 |/\M|	\M	\M	对之后模式中字符关闭 'magic' 选项
 |/\v|	\v	\v	对之后模式中字符设定 'magic' 选项为 "very magic"
 |/\V|	\V	\V	对之后模式中字符设定 'magic' 选项为 "very nomagic"
-|/\Z|	\Z	\Z	忽略 Unicode 中的 "组合用字符",对于搜索带元音的希伯来
-			和阿拉伯文本有用。
 
 |/\%d|	\%d	\%d	匹配用十进制指定的字符 (如 \%d123)
 |/\%x|	\%x	\%x	匹配用十六进制指定的字符 (如 \%x2a)
 |/\%o|	\%o	\%o	匹配用八进制指定的字符 (如 \%o040)
 |/\%u|	\%u	\%u	匹配指定的多字节字符 (如 \%u20ac)
 |/\%U|	\%U	\%U	匹配指定的巨大多字节字符 (如 \%U12345678)
+|/\%#=|   \%#=1   \%#=1   选择正规表达式引擎 |/zero-width|
 
 示例			匹配 ~
 \<\I\i*		或
@@ -525,7 +545,7 @@
 							*/\?*
 \?	和 \= 一样。不能和反向查找的 "?" 命令中使用。{Vi 无此功能}
 
-						*/\{* *E58* *E60* *E554*
+					*/\{* *E58* *E60* *E554* *E870*
 \{n,m}	匹配 n 至 m 个前面的匹配原。尽可能多
 \{n}	匹配 n 个前面的匹配原
 \{n,}	匹配至少 n 个前面的匹配原。尽可能多
@@ -605,10 +625,11 @@
 	示例			匹配 ~
 	\(an\_s\+\)\@<=file	在 "an" 和若干个空白或者行尾符之后的 "file"。
 	为了提高性能,最好避免这个倍数项。可以用 "\zs" 替代 |/\zs|。要匹配
-	上述的示例: >
+	上述的示例:
 		an\_s\+\zsfile
-
-<	"\@<=" 和 "\@<!" 检查刚好在其后模式匹配点之前出现的匹配文本。理论上,
+	反向匹配时至少要设一个限制范围,见下。
+
+	"\@<=" 和 "\@<!" 检查刚好在其后模式匹配点之前出现的匹配文本。理论上,
 	这些匹配可以从当前位置之前的任何地方开始,为了限制所需的时间,只有其后
 	匹配所在的行和它上一行 (如果有上一行的话) 会被检索。这对大多数的应用来
 	说已经足够,而且也不会减慢速度太多。
@@ -617,6 +638,15 @@
 	示例			匹配 ~
 	\1\@<=,\([a-z]\+\)	",abc" in "abc,abc"
 
+\@123<=
+	类似于 "\@<=",但只往回看 123 个字节。这样可以避免去匹配很多已知不会成
+	功的但使模式很慢的尝试。例如,要检查紧接 "span" 之前要否有 "<":
+		/<\@1<=span
+	这里只须对 "span" 之前一个字节试图匹配 "<",本来这也是唯一可能的位置。
+	如果跨过行边界,此限制相对于该行的行尾。这样,匹配所在行的行首部分不计
+	入限制范围 (只是为了简单起见)。
+	零相当于无限制。
+
 							*/\@<!*
 \@<!	零宽度反向否匹配,要求前面的匹配原_不_紧贴在其后的模式之前匹配。换而言
 	之,如果在当前行或之前的一行中没有任何位置这个匹配原可以匹配而且它的匹
@@ -624,9 +654,14 @@
 	类似于 Perl 的 "(?<!pattern)",但是 Vim 允许使用非固定宽度的模式。
 	该倍数所引用的匹配原必须紧贴在其后匹配之前,所以这个匹配原可以用 ".*"
 	结尾。警告: 该倍数项可能会很慢 (因为在匹配之前的许多位置都要被检查)。
+	如有可能,请使用限制范围,见下。
 	示例			匹配 ~
 	\(foo\)\@<!bar		任何不在 "foobar" 中的 "bar"
 	\(\/\/.*\)\@<!in	不在 "//" 之后 (中间可以有间隔) 的 "in"
+
+\@123<!
+	类似于 "\@<!",但只往回看 123 个字节。这样可以避免去匹配很多已知不会成
+	功的但使模式很慢的尝试。
 
 							*/\@>*
 \@>	匹配前面的匹配原时要求完整匹配 (不能回溯)。{Vi 无此功能}
@@ -856,7 +891,8 @@
 ~	匹配上次给出的替代字符串			*/~* */\~*
 
 \(\)	一个由转义的括号括起来的模式。			*/\(* */\(\)* */\)*
-	例: "\(^a\)" 匹配行首的 'a'。			*E51* *E54* *E55*
+	例: "\(^a\)" 匹配行首的 'a'。
+	*E51* *E54* *E55* *E872* *E873*
 
 \1      匹配和第一个 \( 和 \) 之间的子表达式的匹配文本	*/\1* *E65*
 	相同的字符串。 {Vi 无此功能}
@@ -884,6 +920,8 @@
 	[xyz]		'x'、'y' 或 'z' 之一
 	[a-zA-Z]$	出现在行尾的字母字符
 	\c[a-z]$	同上
+	[А-яЁё]		俄语字符集 (包括 utf-8 和 cp1251)
+
 								*/[\n]*
 	如果在集合前加上 "\_" 的话,同时匹配行尾符,这等价于给集合加上 "\n"。
 	即使该模式以 "^" 开始,也能匹配行尾符!因此 "\_[^ab]" 将匹配行尾符以及
@@ -941,6 +979,7 @@
 	  对于 '\' 你也可以将其放置在除了 "^]-\bdertnoUux" 以外的任何一个字符
 	  之前而无须转义: "[\xyz]" 匹配 '\','x','y' 及 'z'。但是用 "\\" 好
 	  些,因为将来的扩展可能会在 '\' 之后使用其它字符。
+	- 省略结尾的 ] 不被视为错误。"[]" 等同于 "[]]",匹配 ']' 字符。
 	- 当 'cpoptions' 中不包括 'l' 标志位时,以下转义可用 {Vi 无此功能}:
 		\e	<Esc>
 		\t	<Tab>
@@ -1030,6 +1069,7 @@
 如果模式的任何位置出现了 "\Z",合成用字符将被忽略。这时,只比较基本字符,合成
 用字符可以不同,其数量也可以不同。这一功能只在 'encoding' 为 'utf-8' 时有意
 义。
+例外: 如果模式以一或多个合成用字符开始,它们必须匹配。
 
 如果一个合成用字符出现在模式的开始处或在不包含合成用字符的项目之后出现,它匹配
 任何包含该合成用字符的字符。
@@ -1037,9 +1077,20 @@
 句号和合成用字符联用和合成用字符本身的效果相同,但是你不用担心该字符前面出现的
 是什么项目。
 
-合成用字符出现的顺序是重要的,虽然对一个字符而言,其上多个合成用字符的顺序调换
-并不影响它的外观。将来这一点可能会改变。
-
+合成用字符出现的顺序无关重要。另外,文本可以使用比模式更多的合成用字符,它仍然
+匹配。但模式中合成用字符必须全数出现在文本中。
+
+假定 B 是基本字符,x 和 y 是合成用字符:
+	模式		文本		匹配与否 ~
+	Bxy		Bxy		是 (完全匹配)
+	Bxy		Byx		是 (忽略顺序)
+	Bxy		By		否 (缺失 x)
+	Bxy		Bx		否 (缺失 y)
+	Bx		Bx		是 (完全匹配)
+	Bx		By		否 (缺失 x)
+	Bx		Bxy		是 (忽略多余的 y)
+	Bx		Byx		是 (忽略多余的 y)
+ 
 ==============================================================================
 9. 与 Perl 模式的比较					*perl-patterns*