1- # Unicode:修饰符 “u” 和 class \p{...}
1+ # Unicode:修饰符 "u" 和 class \p{...}
22
3- JavaScript 使用 [ Unicode 编码] ( https://en.wikipedia.org/wiki/Unicode ) (Unicode encoding)对字符串进行编码 。大多数字符使用 2 个字节编码,但这种方式只能编码最多 65536 个字符。
3+ JavaScript 对字符串使用 [ Unicode 编码] ( https://en.wikipedia.org/wiki/Unicode ) 。大多数字符使用 2 个字节编码,但这种方式只能编码最多 65536 个字符。
44
5- 这个范围不足以对所有可能的字符进行编码,这就是为什么一些罕见的字符使用 4 个字节进行编码 ,比如 ` 𝒳 ` (数学符号 X)或者 ` 😄 ` (笑脸),一些象形文字等等。
5+ 这个范围不足以对所有可能的字符进行编码,这就是为什么使用 4 个字节对一些罕见的字符进行编码 ,比如 ` 𝒳 ` (数学符号 X)或 ` 😄 ` (笑脸),一些象形文字等等。
66
7- 以下是一些字符对应的 unicode 编码 :
7+ 下面是一些字符对应的 Unicode 值 :
88
9- | 字符 | Unicode | unicode 中的字节数 |
9+ | 字符 | Unicode | Unicode 中的字节数 |
1010| ------------ | --------- | ---------------------- |
1111| a | ` 0x0061 ` | 2 |
1212| ≈ | ` 0x2248 ` | 2 |
1313| 𝒳 | ` 0x1d4b3 ` | 4 |
1414| 𝒴 | ` 0x1d4b4 ` | 4 |
1515| 😄 | ` 0x1f604 ` | 4 |
1616
17- 所以像 ` a ` 和 ` ≈ ` 这样的字符占用 2 个字节,而 ` 𝒳 ` ,` 𝒴 ` 和 ` 😄 ` 的对应编码则更长,它们具有 4 个字节的长度 。
17+ 所以像 ` a ` 和 ` ≈ ` 这样的字符占用 2 个字节,而 ` 𝒳 ` ,` 𝒴 ` 和 ` 😄 ` 的对应编码则更长,占用 4 个字节 。
1818
19- 很久以前,当 JavaScript 被发明出来的时候,Unicode 的编码要更加简单:当时并没有 4 个字节长的字符 。所以,一部分语言特性在现在仍旧无法对 unicode 进行正确的处理 。
19+ 很久以前,当 JavaScript 被发明出来的时候,Unicode 编码要更加简单:当时没有 4 个字节的字符 。所以,有些语言功能现在仍无法正确处理它们 。
2020
21- 比如 ` length ` 认为这里的输入有 2 个字符:
21+ 比如 ` length ` 认为这里有 2 个字符:
2222
2323``` js run
2424alert (' 😄' .length ); // 2
2525alert (' 𝒳' .length ); // 2
2626```
2727
28- ...但我们可以清楚地认识到输入的字符只有一个 ,对吧?关键在于 ` length ` 把 4 个字节当成了 2 个 2 字节长的字符。这是不对的,因为它们必须被当作一个整体来考虑。 (即所谓的“代理伪字符” (surrogate pair),你可以在这里进一步阅读有关的的信息 < info:string > )。
28+ ……但我们可以清楚地认识到这里只有一个字符 ,对吧?关键在于 ` length ` 把 4 个字节当成了 2 个 2 字节长的字符。这是不对的,因为它们必须被当作一个整体来考虑(即所谓的“代理对 (surrogate pair)”,你可以在 < info:string > 中阅读关于代理对的更多信息 )。
2929
30- 默认情况下,正则表达式同样把一个 4 个字节的“长字符”当成一对 2 个字节长的字符。正如在字符串中遇到的情况,这将导致一些奇怪的结果。我们将很快在后面的文章中遇到 < info:regexp-character-sets-and-ranges > 。
30+ 默认情况下,正则表达式也会把一个 4 个字节的“长字符”当成一对 2 个字节长的字符。正如在字符串中遇到的情况,这将导致一些奇怪的结果。我们很快会在后面的章节 < info:regexp-character-sets-and-ranges > 中遇到 。
3131
32- 与字符串有所不同的是,正则表达式有一个修饰符 ` pattern:u ` 被用以解决此类问题。当一个正则表达式使用这个修饰符后 ,4 个字节长的字符将被正确地处理。同时也能够用上 Unicode 属性(Unicode property)来进行查找了。我们接下来就来了解这方面的内容 。
32+ 与字符串有所不同的是,正则表达式有一个修饰符 ` pattern:u ` 被用以解决此类问题。当一个正则表达式带有这个修饰符后 ,4 个字节长的字符将被正确地处理。同时也能够使用 Unicode 属性进行查找了,我们接下来就一起学习它吧 。
3333
34- ## Unicode 属性(Unicode properties) \p{...}
34+ ## Unicode 属性 \p{...}
3535
36- ``` warn header="在 Firefox 和 Edge 中缺乏支持"
37- 尽管 unicode property 从 2018 年以来便作为标准的一部分, 但 unicode 属性在 Firefox ([bug](https://bugzilla.mozilla.org/show_bug.cgi?id=1361876)) 和 Edge ([bug](https://github.com/Microsoft/ChakraCore/issues/2969)) 中并没有相应的支持。
36+ Unicode 中的每个字符都有很多属性。它们描述了字符所属的“类别”,包含了关于字符的各种信息。
3837
39- 目前 [XRegExp](http://xregexp.com) 这个库提供“扩展”的正则表达式,其中包括对 unicode property 的跨平台支持。
40- ```
41-
42- Unicode 中的每一个字符都具有很多的属性。它们描述了一个字符属于哪个“类别”,包含了各种关于字符的信息。
43-
44- 例如,如果一个字符具有 ` Letter ` 属性,这意味着这个字符归属于(任意语言的)一个字母表。而 ` Number ` 属性则表示这是一个数字:也许是阿拉伯语,亦或者是中文,等等。
38+ 例如,如果一个字符具有 ` Letter ` 属性,这意味着这个字符归属于(任意语言的)字母表。而 ` Number ` 属性则表示这是一个数字:也许是阿拉伯数字,亦或是中文数字,等等。
4539
46- 我们可以查找具有某种属性的字符,写作 ` pattern:\p{…} ` 。为了顺利使用 ` pattern:\p{…} ` ,一个正则表达式必须使用修饰符 ` pattern:u ` 。
40+ 我们可以查找具有某种属性的字符,写作 ` pattern:\p{…} ` 。为了使用 ` pattern:\p{…} ` ,一个正则表达式必须使用修饰符 ` pattern:u ` 。
4741
48- 举个例子,` \p{Letter} ` 表示任何语言中的一个字母。我们也可以使用 ` \p{L} ` ,因为 ` L ` 是 ` Letter ` 的一个别名(alias) 。对于每种属性而言,几乎都存在对应的缩写别名。
42+ 举个例子,` \p{Letter} ` 表示任何语言中的一个字母。我们也可以使用 ` \p{L} ` ,因为 ` L ` 是 ` Letter ` 的一个别名。对于每种属性而言,几乎都存在对应的缩写别名。
4943
50- 在下面的例子中 3 种字母将会被查找出 :英语、格鲁吉亚语和韩语。
44+ 在下面的例子中会找出来 3 种字母 :英语、格鲁吉亚语和韩语。
5145
5246``` js run
5347let str = " A ბ ㄱ" ;
5448
5549alert ( str .match (/ \p {L}/ gu ) ); // A,ბ,ㄱ
56- alert ( str .match (/ \p {L}/ g ) ); // null(没有匹配的文本 ,因为没有修饰符“u” )
50+ alert ( str .match (/ \p {L}/ g ) ); // null(没有匹配项 ,因为没有修饰符 "u" )
5751```
5852
5953以下是主要的字符类别和它们对应的子类别:
6054
61- - 字母(Letter) ` L ` :
62- - 小写(lowercase) ` Ll `
63- - 修饰(modifier) ` Lm ` ,
64- - 首字母大写(titlecase) ` Lt ` ,
65- - 大写(uppercase) ` Lu ` ,
66- - 其它(other) ` Lo ` 。
67- - 数字(Number) ` N ` :
68- - 十进制数字(decimal digit) ` Nd ` ,
69- - 字母数字(letter number) ` Nl ` ,
70- - 其它(other) ` No ` 。
71- - 标点符号(Punctuation) ` P ` :
72- - 链接符 (connector) ` Pc ` ,
73- - 横杠(dash) ` Pd ` ,
74- - 起始引用号 (initial quote) ` Pi ` ,
75- - 结束引用号 (final quote) ` Pf ` ,
76- - 开(open) ` Ps ` ,
77- - 闭(close) ` Pe ` ,
78- - 其它(other) ` Po ` 。
79- - 标记(Mark) ` M ` ( accents etc):
80- - 间隔合并(spacing combining) ` Mc ` ,
81- - 封闭(enclosing) ` Me ` ,
82- - 非间隔(non-spacing) ` Mn ` 。
83- - 符号(Symbol) ` S ` :
84- - 货币(currency) ` Sc ` ,
85- - 修饰(modifier) ` Sk ` ,
86- - 数学(math) ` Sm ` ,
87- - 其它(other) ` So ` 。
88- - 分隔符(Separator) ` Z ` :
89- - 行(line) ` Zl ` ,
90- - 段落(paragraph) ` Zp ` ,
91- - 空格(space) ` Zs ` 。
92- - 其它(Other) ` C ` :
93- - 控制符(control) ` Cc ` ,
94- - 格式(format) ` Cf ` ,
95- - 未分配(not assigned) ` Cn ` ,
96- - 私有(private use) ` Co ` ,
97- - 代理伪字符(surrogate) ` Cs ` 。
55+ - 字母(Letter)` L ` :
56+ - 小写(lowercase)` Ll ` ,
57+ - 修饰(modifier)` Lm ` ,
58+ - 首字母大写(titlecase)` Lt ` ,
59+ - 大写(uppercase)` Lu ` ,
60+ - 其它(other)` Lo ` 。
61+ - 数字(Number)` N ` :
62+ - 十进制数字(decimal digit)` Nd ` ,
63+ - 字母数字(letter number)` Nl ` ,
64+ - 其它(other)` No ` 。
65+ - 标点符号(Punctuation)` P ` :
66+ - 连接符 (connector)` Pc ` ,
67+ - 横杠(dash)` Pd ` ,
68+ - 起始引号 (initial quote)` Pi ` ,
69+ - 结束引号 (final quote)` Pf ` ,
70+ - 开(open)` Ps ` ,
71+ - 闭(close)` Pe ` ,
72+ - 其它(other)` Po ` 。
73+ - 标记(Mark)` M ` ( accents etc):
74+ - 间隔合并(spacing combining)` Mc ` ,
75+ - 封闭(enclosing)` Me ` ,
76+ - 非间隔(non-spacing)` Mn ` 。
77+ - 符号(Symbol)` S ` :
78+ - 货币(currency)` Sc ` ,
79+ - 修饰(modifier)` Sk ` ,
80+ - 数学(math)` Sm ` ,
81+ - 其它(other)` So ` 。
82+ - 分隔符(Separator)` Z ` :
83+ - 行(line)` Zl ` ,
84+ - 段落(paragraph)` Zp ` ,
85+ - 空格(space)` Zs ` 。
86+ - 其它(Other)` C ` :
87+ - 控制符(control)` Cc ` ,
88+ - 格式(format)` Cf ` ,
89+ - 未分配(not assigned)` Cn ` ,
90+ - 私有(private use)` Co ` ,
91+ - 代理伪字符(surrogate)` Cs ` 。
9892
9993
10094因此,比如说我们需要小写的字母,就可以写成 ` pattern:\p{Ll} ` ,标点符号写作 ` pattern:\p{P} ` 等等。
10195
10296也有其它派生的类别,例如:
103- - ` Alphabetic ` ( ` Alpha ` ), 包含了字母 ` L ` , 加上字母数字 ` Nl ` (例如 Ⅻ - 罗马数字 12),加上一些其它符号 ` Other_Alphabetic ` ( ` OAlpha ` ) 。
97+ - ` Alphabetic ` ( ` Alpha ` ), 包含了字母 ` L ` , 加上字母数字 ` Nl ` (例如 Ⅻ —— 罗马数字 12),加上一些其它符号 ` Other_Alphabetic ` ( ` OAlpha ` ) 。
10498- ` Hex_Digit ` 包括 16 进制数字 ` 0-9 ` ,` a-f ` 。
105- - ...等等
99+ - ……等等。
106100
107- Unicode 支持相当数量的属性,列出整个清单需要占用大量的空间 ,因此在这里列出相关的链接:
101+ Unicode 支持很多不同的属性,列出整个清单需要占用大量的篇幅 ,因此在这里列出相关的链接:
108102
109- - 列出一个字符的所有属性 < https://unicode.org/cldr/utility/character.jsp > .
110- - 按照属性列出所有的字符 < https://unicode.org/cldr/utility/list-unicodeset.jsp > .
103+ - 列出一个字符的所有属性: < https://unicode.org/cldr/utility/character.jsp > .
104+ - 按照属性列出所有的字符: < https://unicode.org/cldr/utility/list-unicodeset.jsp > .
111105- 属性的对应缩写形式:< https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt > .
112106- 以文本格式整理的所有 Unicode 字符,包含了所有的属性:< https://www.unicode.org/Public/UCD/latest/ucd/ > .
113107
114- ### 实例 :16 进制数字
108+ ### 举例 :16 进制数字
115109
116110举个例子,让我们来查找 16 进制数字,写作 ` xFF ` 其中 ` F ` 是一个 16 进制的数字(0..9 或者 A..F)。
117111
@@ -123,45 +117,45 @@ let regexp = /x\p{Hex_Digit}\p{Hex_Digit}/u;
123117alert (" number: xAF" .match (regexp)); // xAF
124118```
125119
126- ### 实例 :中文字符
120+ ### 举例 :中文字符
127121
128- 让我们再来考虑中文字符 。
122+ 让我们再来查找中文字符 。
129123
130- 有一个 unicode 属性 ` Script ` (一个书写系统),这个属性可以有一个值 :` Cyrillic ` , ` Greek ` , ` Arabic ` , ` Han ` (中文)等等,[ 这里是一个完整的列表] ( https://en.wikipedia.org/wiki/Script_(Unicode) ) 。
124+ 有一个 Unicode 属性 ` Script ` (一个书写系统),这个属性可能有一个值 :` Cyrillic ` 、 ` Greek ` 、 ` Arabic ` 、 ` Han ` (中文)等等,[ 这里是一个完整的列表] ( https://en.wikipedia.org/wiki/Script_(Unicode) ) 。
131125
132- 为了实现查找一个给定的书写系统中的字符 ,我们需要使用 ` pattern:Script=<value> ` ,例如对于西里尔字符 :` pattern:\p{sc=Cyrillic} ` , 中文字符 :` pattern:\p{sc=Han} ` ,等等。
126+ 要在给定的书写系统中查找字符 ,我们需要使用 ` pattern:Script=<value> ` ,例如对于西里尔字母 :` pattern:\p{sc=Cyrillic} ` ,中文象形文字 :` pattern:\p{sc=Han} ` ,等等。
133127
134128``` js run
135- let regexp = / \p {sc=Han}/ gu ; // returns Chinese hieroglyphs
129+ let regexp = / \p {sc=Han}/ gu ; // 返回中文象形文字
136130
137131let str = ` Hello Привет 你好 123_456` ;
138132
139133alert ( str .match (regexp) ); // 你,好
140134```
141135
142- ### 实例 :货币
136+ ### 举例 :货币
143137
144- 表示货币的字符,例如 ` $ ` , ` € ` , ` ¥ ` ,具有 unicode 属性 ` pattern:\p{Currency_Symbol} ` ,缩写为 ` pattern:\p{Sc} ` 。
138+ 表示货币的字符,例如 ` $ ` 、 ` € ` 和 ` ¥ ` ,具有 Unicode 属性 ` pattern:\p{Currency_Symbol} ` ,缩写为 ` pattern:\p{Sc} ` 。
145139
146- 让我们使用这一属性来查找符合 “货币,接着是一个数字”的价格文本 :
140+ 让我们用它来查找格式为 “货币,接着是一个数字”的价格 :
147141
148142``` js run
149143let regexp = / \p {Sc}\d / gu ;
150144
151- let str = ` Prices: $2, €1, ¥9` ;
145+ let str = ` Prices: $2, €1, ¥9` ;
152146
153147alert ( str .match (regexp) ); // $2,€1,¥9
154148```
155149
156- 之后 ,在文章 < info:regexp-quantifiers > 中我们将会了解如何查找包含很多位的数字 。
150+ 稍后 ,在文章 < info:regexp-quantifiers > 中我们将学习如何查找包含很多位的数字 。
157151
158152## 总结
159153
160- 修饰符 ` pattern:u ` 在正则表达式中提供对 Unicode 的支持。
154+ 修饰符 ` pattern:u ` 表示启用正则表达式中对 Unicode 的支持。
161155
162156这意味着两件事:
163157
164- 1 . 4 个字节长的字符被以正确的方式处理:被看成单个的字符 ,而不是 2 个 2 字节长的字符。
165- 2 . Unicode 属性可以被用于查找中 ` \p{…} ` 。
158+ 1 . 4 个字节长的字符被以正确的方式处理:被看成单个字符 ,而不是 2 个 2 字节长的字符。
159+ 2 . Unicode 属性可以被用于查找: ` \p{…} ` 。
166160
167161有了 unicode 属性我们可以查找给定语言中的词,特殊字符(引用,货币)等等。
0 commit comments