perl语言编程 第五章 模式匹配 下

上一篇 / 下一篇  2008-04-18 11:49:42 / 个人分类:关于脚本语言

5.3 元字符和元符号

既然我们尊重这些神奇的笼子,那么我们就可以回过头来看看笼子里的动物了,也就是那些你放在模式里好看的符号。到现在你应该已经看到这样的事实,就是这些符号并不是普通的函数调用或者算术操作符那样的 Perl 代码。正则表达式本身就是嵌入 Perl 的小型语言。(在现实社会里总是有小丛林。)

Perl 里的模式识别所有的 12 个传统的元字符(所谓十二烂人),以及它们的所有潜能和表现力。许多其他正则表达式包里也能看到它们:

\ | () [ { ^ $ * + ? .

它们中有些曲解规则,令跟在它们后面本来正常的字符变成特殊的。我们不喜欢把长序列叫做“字符”,因此,如果它们组成长序列后,我们叫它们元符号(有时候干脆就叫“符号”)。但是在顶级,这十二个元字符就是你(和 Perl)需要考虑的所有内容。任何东西都是从这里开始的。

有些简单的元字符就代表它们自己,象 . 和 ^ 和 $。它们并不直接影响它们周围的任何东西。有些元字符运行起来象前缀操作符,控制任何跟在后面的东西,象反斜杠 “\” 。其他的则像后缀操作符,控制紧排在它们前面的东西,像 *,+,和 ?。有一个元字符:|,其作用象中缀操作符,站在它控制的操作数中间。甚至还有括弧操作符,作用类似包围操作符,控制一些被它包围的东西,像 (...) 和 [...]。圆括弧尤其重要,因为它们在内部声明 | 的范围,而在外部声明 *,+ 和 ? 的范围。

如果你只学习十二个元字符中的一个,那么选反斜杠。(恩。。。还有圆括弧)这是因为反斜杠令其他元字符失效。如果在一个 Perl 模式里,一个反斜杠放在一个非字母数字字符前,这样就让下一个字符成为一个字面的文本。如果你象在一个模式文本里匹配十二个元字符中的任何一个,你可以在它们前面写一个反斜杠。因此,\. 匹配一个真正的点,\$ 匹配真正的美圆符,\\ 是一个真正的反斜杠等等。这样做被称做“逃逸”元字符,或曰“引号包围之”,或者有时候就叫做“反斜杠某”。(当然,你已经知道反斜杠可以用于禁止在双引号字串里进行变量代换。)

虽然一个反斜杠把一个元字符转换成一个文本字符,它对后继的字母数字字符的作用却是完全另一码事。它把本来普通的东西变特别。也就是说,它们在一起形成元字符。我们在表 5-7 里给出了一个按字母排序的元字符表。

5.3.1 元字符表

符号原子性含义
\...变化反逃逸下一个非字母数字字符,转意下一个字母数字(可能)
...|...可选(匹配前者或者后者)。
(...)分组(当作单元对待)。
[...]字符表(匹配一个集合中的一个字符)。
如果在字串开头则为真(或者可能是在任何换行符后面。)
.匹配一个字符(通常除了换行符以外)。
$在字串尾部时为真(或者可能是在任何换行符前面)。

至于量词,我们会在它们自己的节里详细描述。量词表示前导的原子(也就是说,单字符或者分组)应该匹配的次数。它们列在表 5-5 中。

表 5-5。 正则量词

量词原子性含义
*匹配 0 或者更多次数(最大)。
+匹配 或者更多次数(最大)。
?匹配 1 或者0次(最大)。
{COUNT}匹配COUNT 次
{MIN,}匹配至少MIN次(最大)。
{MIN,MAX}匹配至少MIN次但不超过MAX次(最大)
*?匹配0或者更多次(最小)
+?匹配1或者更多次(最小)
??匹配0或者1次(最小)
{MIN,}?匹配最多MIN次(最小)
{MIN,MAX}?匹配至少MIN次但不超过MAX次(最小)

最小量词会试图匹配在它的许可范围内的尽可能少的次数。最大量词会试图匹配在它的许可范围内的尽可能多的次数。比如, .+ 保证至少匹配字串的一个字符,但是如果有机会,它会匹配所有机会。这里的机会将在稍后的“小引擎的/能与不能/”节里讲。

你还会注意量词决不能量化。

我们想给新类型的元符号一个可以扩展的语法。因为我们只需要使用十二个元字符,所以我们选用原先被认为是非法正则的序列做任意语法扩展。这些元符号的形式都是 (?KEY...);也就是,一个开圆括弧后面跟着一个问号,然后是 KEY 和模式其余部分。KEY 字符表明它是哪种正则扩展。参阅表 5-6 看看正则扩展的一个列表。它们中大多数性质象列表,因为它们基于圆括弧,不过它们还是有附加含义。同样,只有原子可以量化,因为它们代表真正存在(潜在地)的东西。

表 5-6 扩展的正则序列

扩展原子性含义
(?#...)注释,抛弃
(?:...)只集群,不捕获的圆括弧
(?imsx-imsx)打开/关闭模式修饰词
(?imsx-imsx:...)集群圆括弧加修饰词
(?=...)如果前向查找断言成功,返回真
(?!...)如果前向查找断言失败,返回真
(?<=...) </td>如果前向查找断言成功,返回真
(?如果前向查找断言失败,返回真
(?>...)匹配未反向跟踪的子模式
(?{...})执行嵌入的Perl代码
(??{...})匹配来自嵌入Perl代码。
(?(...)......)匹配if-then-elase模式
(?(...)...)匹配if-then模式

最后,表 5-7 显示了所有你常用的字母数字元符号。(那些在变量代换回合处理过的符号在原子性列里用一个划线标记,因为引擎永远不会看到它们。)

表 5-7。字母数字正则元符号

符号原子性含义
\0匹配空字符(ASCII NUL)。
\NNN匹配给出八进制的字符,最大值为\377。
\n匹配前面第n个捕获字串(十进制)。
\a匹配警钟字符(BEL)。
\A如果在字串的开头为真
\b匹配退各字符(BS)。
\b在字边界为真
\B不在字边界时为真
\cX匹配控制字符 Control-x(\cZ,\c[,等)。
\C匹配一个字节(C字符),甚至在utf8中也如此(危险)
\d匹配任何数字字符
\D匹配任何非数字字符
\e匹配逃逸字符(ASCII ESC,不是反斜杠)。
\E——结束大小写(\L,\U)或者掩码(\Q)转换
\f匹配进页字符(FF)。
\G如果在前一个m//g的匹配结尾位置时为真
\l——只把下一个字符变成小写
\L——把\E以前的字母都变成小写
\n匹配换行符字符(通常是NL,但是在Mac上是CR)。
\N{NAME}匹配命名字符(\N{greek:Sigma})。
\p{PROP}匹配任何有命名属性的字符
\P{PROP}匹配任何没有命名属性的字符
\Q——引起(消元)直到\E前面的字符
\r匹配返回字符(通常是CR,但是在Mac上是NL)。
\s匹配任何空白字符。
\S匹配任何非空白字符。
\t匹配水平制表符(HT)。
\u——只把下一个字符变成标题首字符
\U——大写(不是标题首字符)\E 以前的字符。
\w匹配任何“字”字符(字母数字加"_" )。
\W匹配任何“非字”字符。
\x{abcd}匹配在十六进制中给出的字符。
\X匹配Unicode里的”组合字符序列“字串。
\z只有在字串结尾时为真
\Z在字串结尾或者在可选的换行符之前为真。

如果在 \p 和 \P 里的属性名字是一个字符,那么花括弧是可选的。如果 \x 里的十六进制数为两位或者更少,那么花括弧也是可选的。在 \N 里的花括弧决不能省略。

只有在含义中带“匹配。。。”或者“匹配任何。。。”字样的元符号才能够在字符表(方括弧)里面使用。也就是说,字符表仅限于包含特定的字符集,因此在字符表里面,你只能使用那些描述其他特定字符集的元符号,或者那些描述特定独立字符的元符号。当然,这些元符号也可以和其他非分类元符号一起在字符表外面用,不过,这里请注意 =b 是两只完全不同的怪兽:它在字符表内是退格字符,而在外边是一个字边界断言。

一个模式可以匹配的字符的数量和一个双引号字串可以替换的字符的数量有一些重叠。因为正则要经历两个回合,所以有时候应该由哪个回合处理一个给定的字符会显得有些混乱。如果出现混乱,这种字符的变量代换回合就推迟给正则表达式分析器。

但是只有当变量代换回合知道它正在分析一个正则的时候,它才能把变量代换推迟给正则分析器。你可以把正则表达式声明为普通的双引号包围字串,但这样你就必须遵循普通的双引号包围规则。任何前面碰巧映射为时间字符的元符号仍然生效,即使它们没有被推迟给正则分析器也如此。但是在普通的双引号里你不能使用任何其它的元符号(或者任何类似的构造,比如 `...`,qq(...),qx(...),或者等效的“此处”文档)。如果你想你的字串分析成一个正则表达式而不做任何匹配,你应该使用 qr// (引号构造正则)操作符。

请注意大小写和元引号包围转换逃逸(\U 和它的伙伴)必须在变量代换回合处理,因为这些元符号的用途就是影响变量代换。如果你用单引号禁止变量代换,那么你也不能获得转换逃逸。在任何单引号字串里,都不会进行变量或者转换逃逸(\U等)的扩展,在单号包围的的 m'...' 或者 qr'...' 操作符里也不会。甚至在你做代换的时候,如果这些转换逃逸是一个变量代换的结果,那么它们也会被忽略,因为这个时候他们想要影响变量代换已经太晚了。

尽管字符替换操作符不处理正则表达式,但是我们讨论过的任何匹配单个特定字符的元符号在 tr/// 操作中仍然可用。而其他的用不了(除了反斜杠以外,它继续按照它原来的样子运转。)

5.3.2 特定的字符

如前所述,非特殊的东西在模式里匹配自身。这意味着一个 /a/ 匹配一个 "a",一个 /=/ 匹配一个 "=" 等等。不过,有些字符可不是那么容易在键盘上敲进去,或者即使你敲进去了,也不会在打印输出中显示出来;最臭名昭著的例子就是控制字符。在正则表达式里, Perl 识别下列双引号包围的字符别名:

逃逸含义
\0空字符(ASCII NUL)
\a警铃(BEL)
\e逃逸(ESC)
\f进纸(FF)
\n换行符 (NL,Mac里的CR)
\r回车(CR,Mac里的NL)
\t水平制表符(HT)

就象在双引号包围字串里一样,Perl 还识别模式里的下面四种元符号:

\cX
一个命名的控制字符,象 \cC 指 Control-C,\cZ 指 Control-Z,\c[ 指 ESC,而 \c? 表示 DEL。

\NNN
用两位或者三位八进制码声明的字符。除了小于 010 的数值(十进制 8)外,前导的 0 是可选的,因为(和在双引起字串里不同)一位数字的东西总认为是用于在模式里捕获字串的引用。如果你在模式里先捕获了至少 n 个子字串,那多位数字解释成第 n 个引用(这里 n 被认为是一个十进制数)。否则,他们被解释成一个用八进制声明的字符。

\x{LONGHEX}
一个用一到两个十六进制数位([0-9a-fA-F])声明的字符,比如 \x1B。一位数字的形式只有在后面跟随的字符不是一个十六进制数字才可用。如果使用了花括弧,你想用多少位数字都可以,这时候结果可能是一个 Unicode 字符。比如,\x{262} 匹配一个 Unicode YIN YANG。

\N{NAME}
一个命名字符,如 \N{GREEK SMALL LETTER EPSILON},\N{Greek:epsilon},或者\N{epsilon}。它要求使用第三十一章,用法模块,里描述的 use charnames 用法,它同时还判断你可能使用那些名字中的哪一个(分别是 ":long",":full",":short",对应上面三个风格。)

你可以在离你最近的 Unicode 标准文档里找到所有 Unicode 字符名字的列表,或者在 PATH_TO_PERLLIB/unicode/Names.txt 里也有。

5.3.3 通配元符号

三个特殊的元符号可以用做通用通配符,它们的每一个都可以匹配"任何"字符(是"任何"中的某些字符)。它们是句点("."),\c 和 \x。它们都不能在字符表里使用。你不能在字符表里用句点是因为它会匹配(几乎)任何存在的字符,因此它本身就是某种万能字符。如果你想包括或者排除所有东西,也没有什么必要使用一个字符表。特殊通配符 \C 和 \X 有着特殊的结构化含义,而这些特殊含义和选择单个 Unicode 字符的表示法关联得并不好,而该表示法才是字符表运行的层次.

句点元字符匹配除了换行符以外的任何单字符。(如果带着 /s 修饰词,也能匹配换行符。)和十二个特殊字符里的其它字符一样,如果你想匹配一个文本句点,你就必须用一个反斜扛逃逸它。比如,下面的代码检查一个文件名是否以一个句点后面跟着一个单字符扩展名结尾的:

if ($pathname =~ /\.(.)\z/s) {
      print "Ends in $1\n";
   }

第一个句点是逃逸了的,是文本句点,而第二个句点说"匹配任何字符"。\z 说只匹配字串末尾的东西,而 \s 修饰词令点也可以匹配换行符。(的确,用换行符做文件扩展名不怎么漂亮,但并不是说就不能做。)

点元字符经常和量词一起使用。.* 匹配尽可能多的字符,而 .*? 匹配尽可能少的字符。不过有时候它不用量词而是自己解决长度问题: /(..):(..):(..)/ 匹配三个用冒号分隔的域,每个域两个字符长。

如果你在一个 use utf8 用法的词法范围里编译的模式里使用一个点,那么它就匹配任何 Unicode 字符。(你可能不需要用 use utf8,不过偶然还是会发生的,在你阅读到这里的时候你可能不需要这个用法。)

use utf8;
   use charnames qw/:full/;
   %BWV[887] = "G\N{MUSIC SHARP SIGN} minor";
   ($note, $black, $mode) = $BWV[886] =~ /^([A-G])(.)\s+(\S+)/;
   print "That's lookin' sharp!\n" if $black eq chr(9839);

元符号 \X 在更广的概念上匹配字符。它实际上是匹配一个由一个或多个 Unicode 字符组成的字串,这个字串就是所谓的"组合字符序列"。这样的序列包括一个基本字符和后面跟着任意个"标志"字符(象变音符和分音符那样的区分标志)一起组成一个逻辑单元。\X 实际上等效于 (?:\PM\pM*)。这样做允许匹配一个逻辑字符,即使这几个字符实际上是由几个独立的字符组成的也行。如果匹配任意组合字符,那么在 /\X/ 里匹配的长度将超过一个字符长。(而且这里的字符长度和字节长度没有什么关系)。

如果你在使用 Unicode 并且真的想获取单字节而不是单字符,那么你可以使用 \C 元字符。它将总是匹配一个字节(具体说,就是一个 C 语言的 char 类型),而不管是否会与你的 Unicode 字符流步调失调。参阅第十五章里关于做这些事情时合适的警告。

5.4 字符表

在模式匹配里,你可以匹配任意字符,不管它们有没有特殊性质。有四种声明字符表的方法(译注:孔乙己?:)。你可以按照传统的方法声明字符集——用方括弧和枚举可能的字符,或者或者你可以使用三种记忆法中的任意一种:经典 Perl 表,新PerlUnicode属性,或者标准 POSIX 表。这些缩写均只匹配其字符集中的一个字符。你可以量化它们,使它们可以匹配更多的字符,比如 \d+ 匹配一个或者多个数字。(一个比较容易犯的错误是认为 \w 匹配一个字。用 \w+ 匹配一个字。)

5.4.1 客户化字符表

一个方括弧中的一个枚举字符列表被称为字符表,它匹配列表中的任何一个字符。比如,[aeiouy] 匹配一个英文中的元音字母。(对于威尔士要加 "w",对于苏格兰加个 "r"。)要匹配一个右方括弧,你可以用反斜杠逃逸之或者把它放在列表开头。

字符范围可以用一个连字符和 a-z 表示法表示。你可以合并多个范围;比如 [0-9a-fA-F] 匹配一个十六进制“位”。你可以用反斜杠避免连字符被解释为一个范围分隔符,或者把它放在表的开头或者结尾(后面的方法虽然不易读,但是比较常用)。

在字符表开头的脱字符(或者说是抑扬符号,或者帽子,或者向上箭头 "^" )反转该字符表,结果是匹配任何不在此列表中的字符。(要匹配脱字符,要么不要放在开头,或者是用反斜杠逃逸)。比如,[^aeiouy] 匹配任何不是元音的字母。不过,对待字符表反意要小心些,因为字符的领域在不断扩展。比如,那个字符表匹配辅音——而在西利尔语,希腊语和几乎任何语言里还匹配空白,换行符和其他任何东西(包括元音),更不用说中日韩文里的标记了。而且以后还可能有 Cirth,Tengwar,和 Klingon。(当然,还可能有 Linear B 和 Etruscan)所以你最好还是明确声明你的辅音,比如[cbdfghjklmnpqrstvwxyz],或者简写为 [b-df-hj-p-tv-z]。(这样还解决了“y”需要在两个地方同时出现的问题,排除了一个补集。)

字符表里支持普通字符元符号,(参阅“声明字符”),比如 \n,\t,\cX,\NNN,和 \N{NAME}。另外,你可以在一个字符表里使用 \b 表示一个退格,就象它在双引号字串里显示的那样。通常,在一个模式匹配里,它意味着一个字边界。但是零宽度的断言在字符表里没有任何意义,因此这里的 \b 返回到它在字串里的普通含义。你还可以使用我们本章稍后预定义的任何字符表(经典,Unicode 或 POSIX),但是不要把它们用在一个范围的结尾——那样没有意义,所以 "-" 会被解释成文本。

所有其他的元符号在方括弧中都失去特殊意义。实际上,你不能在这里面使用三个普通通配符中的任何一个:".",\X 或 \C。不允许第一个字符通常令人奇怪,不过把普遍意义的字符表用做有限制的形式的确没有什么意义,而且你常会在一个字符表中要用到文本句点——比如,当你要匹配文件名的时候。而且在字符表里声明量词,断言或者候选都是没有意义的,因为这些字符都是独立解释的。比如,[fee|fie|foe|foo] 和 [feio|] 是一样的。

5.4.2 典型 Perl 字符表缩写

从一开始,Perl 就已经提供了一些字符表缩写。它们在表 5-8 中列出。它们都是反斜杠字母元字符,而且把它们的字母换成大写后,它们的含义就是小写版本的反义。这些元字符的含义并不像你想象的那么固定,其含义可能在新的 Unicode 标准出台后改变,因为新标准会增加新的数字和字母。(为了保持旧的字节含义,你总是可以使用 use bytes。要解释 utf8 的含义,参阅本章后面的 "Unicode 属性"。不管怎样,utf8 含义都是字节含义的超集。)

表 5-8 典型字符表

符号含义做字节做 utf8
\d数字[0-9]\p{IsDigit}
\D非数字[^0-9}\P{IsDigit}
\s空白[ \t\n\r\f]\p{IsSpace}
\S非空白[^ \t\n\r\f]\P{IsSpace}
\w[a-zA-Z0-9_]\p{IsWord}
\W非字[^a-zA-Z0-9_]\P{IsWord}

(好好好,我们知道大多数字里面没有数字和下划线,\w 的用意是用于匹配典型的编程语言里的记号。就目前而言,是匹配 Perl 里的记号。)

这些元符号在方括弧外面或者里面都可以使用,也就是说不管作为独立存在的符号还是作为一个构造成的字符表的一部分存在都行:

if ($var =~ /\D/)   { warn "contains non-digit" }
   if ($var =~ /[^\w\s.]/) { warn "contains non-(word, space, dot)"}

5.4.3 Unicode 属性

Unicode 属性可以用 \p{PROP} 及其补集 \P{PROP} 获取.对于那些比较少见的名字里只有一个字符的属性,花括弧是可选的,就象 \pN 表示一个数字字符(不一定是十进制数 -罗马数字也是数字字符)。这些属性表可以独自使用或者与一个字符表构造一起使用:

if ($var =~ /^\p{IsAlpha}+$/)    {print "all alphabetic" }
   if ($var =~ s/[\p{Zl}\p{Zp}]/\n/g) {print "fixed newline wannabes"}

有些属性是直接由 Unicode 标准定义的,而有些属性是 Perl 基于标准属性组合定义的,Zl 和 Zp 都是标准 Unicode 属性,分别代表行分隔符和段分隔符,而IsAlpha?是 Perl 而IsAlpha?是 Perl 定义的,是一个组合了标准属性 Ll, Lu, Lt, 和 Lo (也就是小写,大写,标题或者其它字母)的属性表。在 Perl 5.6.0 里,要想用这些属性,你得用 use utf8。将来会放松这个限制。

还有很多其它属性。我们会列出我们知道的那些,但是这个列表肯定不完善。很可能在新版本的 Unicode 里会定义新的属性,而且你甚至也可以定义自己的属性。稍后我们将更详细地介绍这些。

Unicode 委员会制作了在线资源,这些资源成为 Perl 用于其 Unicode 实现里的各种文件。关于更多这些文件的信息,请参阅第 15 章。你可以在文档 PATH_TO_PERLLIB/unicode/Unicode3.html 里获得很不错的关于 Unicode 的概述性介绍。这里 PATH_TO_PERLLIB 是下面命令的打印输出:

perl -MConfig -le 'print $Config{privlib}'

大多数 Unicode 的属性形如 \p{IsPROP}。Is 是可选的,因为它太常见了,不过你还是会愿意把它们写出来的,因为可读性好。

5.4.3.1 Perl 的 Unicode 属性

首先,表 5-9 列出了 Perl 的组合属性。它们定义得合理地接近于标准 POSIX 定义的字符表。

表5-9.组合 Unicode 属性

属性等效
IsASCII?[\x00-\x7f]
IsAlnum?[\p{IsLl}\p{IsLu}\p{IsLt}\p{IsLo}\p{IsNd}]
IsAlpha?[\p{IsLl}\p{IsLu}\p{IsLt}\p{IsLo}]
IsCntrl?\p{IsC}
IsDigit?\p{Nd}
IsGraph?[^\pC\p{IsSpace}]
IsLower?\p{IsLl}
IsPrint?\P{IsC}
IsPunct?\p{IsP}
IsSpace?[\t\n\f\r\p{IsZ}]
IsUpper?[\p{IsLu}\p{IsLt}]
IsWord?[_\p{IsLl}\p{IsLu}\p{IsLt}\p{IsLo}\p{IsNd}]
IsXDigit?[0-9a-fA-F]

Perl 还为标准 Unicode 属性(见下节)的每个主要范畴提供了下列组合:

属性含义是否规范的
IsC?错误控制代码等
IsL?字母部分
IsM?标志
IsN?数字
IsP?标点
IsS?符号
IsZ?分隔符

5.4.3.2 标准的 Unicode 属性

表 5-10 列出了大多数基本的标准 Unicode 属性,源自每个字符的类别。没有哪个字符是多于一个类别的成员。有些属性是规范的,而有些只是提示性的。请参阅 Unicode 标准获取那些标准的说辞,看看什么是规范信息,而什么又是提示信息。

表 5-10 标准 Unicode 属性

属性含义规范化
IsCc?其他,控制
IsCf?其他,格式
IsCn?其他,未赋值
IsCo?其他,私有使用
IsCs?其他,代理
IsLl?字母,小写
IsLm?字母,修饰词
IsLo?字母,其他
IsLt?字母,抬头
IsLu?字母,大写
IsMc?标记,组合
IsMe?标记,闭合
IsMn?标记,非空白
IsNd?数字,十进制数
IsNl?数字,字母
IsNo?数字,其他
IsPc?标点,联接符
IsPd?标点,破折号
IsPe?标点,关闭
IsPf?标点,结束引用
IsPi?标点,初始引用
IsPo?标点,其他
IsPs?标点,打开
IsSc?符号,货币
IsSk?符号,修饰词
IsSm?符号,数学
IsSo?符号,其他
IsZl?分隔符,行
IsZp?分隔符,段落
IsZs?分隔符,空白

另外一个有用的属性集是关于一个字符是否可以分解为更简单的字符。(规范分解或者兼容分解)。规范分解不会丢失任何格式化信息。兼容分解可能会丢失格式信息,比如一个字符是否上标等。

属性信息丢失
IsDecoCanon?
IsDecoCompat?有一些(下列之一)
IsDCcircle?字符周围的圆
IsDCfinal?最终的位置(阿拉伯文)
IsDCfont?字体变体的选择
IsDCfraction?俚语字符片段
IsDCinitial?起始位置选择(阿拉伯文)
IsDCisolated?隔离位置选择(阿拉伯文)
IsDCmedial?中间位置选择(阿拉伯文)
IsDCnarrow?窄字符
IsDCnoBreadk?空白或连字符的非中断选
IsDCsmall?小字符
IsDCsquare?CJK字符周围的方块
IsDCsub?脚标
IsDCsuper?上标
IsDCvertical?旋转(水平或垂直)
IsDCwide?宽字符
IsDCcompat?标识(杂项)

下面是那些对双向书写的人感兴趣的属性:

属性含义
IsBidiL?从左向右(阿拉伯语,希伯来语)
IsBidiLRE?从左向右插入

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-07-06  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 2769
  • 日志数: 555
  • 建立时间: 2008-01-07
  • 更新时间: 2008-06-24

RSS订阅