jQuery的sizzle引擎中表示标识符的正则identifier:(?:\\\\.|[\\w-]|[^\0-\\xa0])+
2017-04-22 04:13

identifier正则

在sizzle引擎中,开始就有一个表示标识符的正则,对于正则不熟悉的人一看就会觉得晦涩难懂。今天我们就讲解一下这个正则的具体意义,帮助大家理解。

identifier的正则是这样的:

identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",

(?:x)这种写法是表示这个正则是非捕捉正则,匹配但不捕捉。所谓非捕捉,就是不保存为子组,你不能使用$1-$9来操作它。非捕捉是为了提供性能,跟实际的匹配没有关系。所以我们去除非捕捉匹配后的正则是:

identifier = "(\\\\.|[\\w-]|[^\0-\\xa0])+",

这个正则里面的有两个"|"表示或者,那么就是有三种情况可以匹配。

先看第一个"\\\\.",这里,因为正则是以字符串的形式表示的,所以"\\"两个反斜杠表示一个反斜杠,第一个反斜杠是对第二个反斜杠进行转义,“\\\\”四个反斜杠就表示“\\”两个反斜杠字符串,“.”表示除了\n外的任意字符,那它就是可以匹配“\\m”,"\\3"这种字符。标识符正则有这个需求的原因是W3C的规定。

blob.png

w3c文档规定,css的标识符只能包含[a-zA-Z0-9]和ISO 10646标准中的U+00A0和它之后的字符,以及中划线、下划线。不能以数字,两个中划线或者中划线后跟一个数字作为标识符的开始。标识符也可以包含转义字符和任意ISO 10646作为数字编码。例如标识符“B&W?”可以写成“B\26 W\3F”。

因为标识符可以是转义字符记上任意的ISO字符作为数字编码,所以正则中需要“\\\\.”这个匹配。

第二个“[\\w-]”就是表示"[a-zA-Z0-9_-]",是满足w3c标准中的ASCII已经中划线、下划线的需求,这个或者比较简单。

第三个"[^\0-\\xa0]",这个是为了满足W3C中字符要是“U+00A0”以及其后的字符的要求,\0是8进制表示法,\xa0是16进制表示法,和“U+00A0”相等,这个其实sizzle引擎是多刨除了一个字符“\xa0”,而“\xa0”代表“ ”空格,所以相当于去除了空格,这个符合我们实际情况。


因为\xa0是这么一些奇形怪状的字符,恐怕在页面中,我们很难输入到,更不会拿他最为标识符来用。并且在web浏览器中,这些字符打出来大多都是空字符。

"^"就不用多说了,是表示排除\0-\xa0这些字符的。

blob.png

\0表示的是C0控制符中的NUL。是ISO 10646编码的0位置开始,\0-\xa0表示的是0-xa0范围内的字符都排除。

C0控制符有很多:

控制字符最初被设计用来控制诸如打印机和磁带驱动器之类的硬件设备。

控制字符(除了水平制表符、换行、回车之外)在 HTML 文档中不起任何作用。

字符十进制十六进制描述
NUL00000空字符(null character)
SOH10001标题开始(start of header)
STX20002正文开始(start of text)
ETX30003正文结束(end of text)
EOT40004传输结束(end of transmission)
ENQ50005请求(enquiry)
ACK60006收到通知/响应(acknowledge)
BEL70007响铃(bell)
BS80008退格(backspace)
HT90009水平制表符(horizontal tab)
LF10000A换行(line feed)
VT11000B垂直制表符(vertical tab)
FF12000C换页(form feed)
CR13000D回车(carriage return)
SO14000E不用切换(shift out)
SI15000F启用切换(shift in)
DLE160010数据链路转义(data link escape)
DC1170011设备控制 1(device control 1)
DC2180012设备控制 2(device control 2)
DC3190013设备控制 3(device control 3)
DC4200014设备控制 4(device control 4)
NAK210015拒绝接收/无响应(negative acknowledge)
SYN220016同步空闲(synchronize)
ETB230017传输块结束(end transmission block)
CAN240018取消(cancel)
EM250019已到介质末端/介质存储已满(end of medium)
SUB26001A替补/替换(substitute)
ESC27001B溢出/逃离/取消(escape)
FS28001C文件分隔符(file separator)
GS29001D组分隔符(group separator)
RS30001E记录分隔符(record separator)
US31001F单元分隔符(unit separator)




DEL127007F删除(delete)

这些个控制字符我们大致了解一下就可以了,它在web页面中绝大部分都没有用。

而xa0和其以后的一部分字符如下:

字符十进制十六进制实体名称

16000A0 不换行空格(NO-BREAK SPACE)
¡16100A1¡倒置感叹号(INVERTED EXCLAMATION MARK)
¢16200A2¢美分符号(CENT SIGN)
£16300A3£英镑符号(POUND SIGN)
¤16400A4¤货币符号(CURRENCY SIGN)
¥16500A5¥日元符号(YEN SIGN)
¦16600A6¦间断的竖杠(BROKEN BAR)
§16700A7§小节号(SECTION SIGN)
¨16800A8¨分音符号(DIAERESIS)
©16900A9©版权所有(COPYRIGHT SIGN)
ª17000AAª阴性序数记号(FEMININE ORDINAL INDICATOR)
«17100AB«左双角引号(LEFT-POINTING DOUBLE ANGLE QUOTATION MARK)
¬17200AC¬否定符号(NOT SIGN)

17300AD­软连字符(SOFT HYPHEN)
®17400AE®注册商标(REGISTERED SIGN)
¯17500AF¯长音符号(MACRON)
°17600B0°度符号(DEGREE SIGN)
±17700B1±加减号/正负号(PLUS-MINUS SIGN)
²17800B2²上标 2(SUPERSCRIPT TWO)
³17900B3³上标 3(SUPERSCRIPT THREE)
´18000B4´尖音符号(ACUTE ACCENT)
µ18100B5µ微米符号(MICRO SIGN)
18200B6¶段落符号(PILCROW SIGN)
·18300B7·中间点(MIDDLE DOT)
¸18400B8¸变音符号(CEDILLA)
¹18500B9¹上标 1(SUPERSCRIPT ONE)
º18600BAº阳性序数记号(MASCULINE ORDINAL INDICATOR)
»18700BB»右双角引号(RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK)
¼18800BC¼1/4 分数(VULGAR FRACTION ONE QUARTER)
½18900BD½1/2 分数(VULGAR FRACTION ONE HALF)
¾19000BE¾3/4 分数(VULGAR FRACTION THREE QUARTERS)
¿19100BF¿倒置问号(INVERTED QUESTION MARK)
À19200C0À带有重音符号(grave)的拉丁文大写字母 A
Á19300C1Á带有尖音符号(acute)的拉丁文大写字母 A
Â19400C2Â带有抑扬音符号(circumflex)的拉丁文大写字母 A
Ã19500C3Ã带有波浪线的拉丁文大写字母 A
Ä19600C4Ä带有分音符(diaeresis)的拉丁文大写字母 A
Å19700C5Å带有上圆圈的拉丁文大写字母 A
Æ19800C6Æ拉丁文大写字母 AE
Ç19900C7Ç带有变音符号(cedilla)的拉丁文大写字母 C
È20000C8È带有重音符号(grave)的拉丁文大写字母 E
É20100C9É带有尖音符号(acute)的拉丁文大写字母 E
Ê20200CAÊ带有抑扬符号(circumflex)的拉丁文大写字母 E
Ë20300CBË带有分音符(diaeresis)的拉丁文大写字母 E
Ì20400CCÌ带有重音符号(grave)的拉丁文大写字母 I
Í20500CDÍ带有尖音符号(acute)的拉丁文大写字母 I
Î20600CEÎ带有抑扬音符号(circumflex)的拉丁文大写字母 I
Ï20700CFÏ带有分音符(diaeresis)的拉丁文大写字母 I
Ð20800D0Ð拉丁文大写字母 ETH
Ñ20900D1Ñ带有波浪线的拉丁文大写字母 N
Ò21000D2Ò带有重音符号(grave)的拉丁文大写字母 O
Ó21100D3Ó带有尖音符号(acute)的拉丁文大写字母 O
Ô21200D4Ô带有抑扬音符号(circumflex)的拉丁文大写字母 O
Õ21300D5Õ带有波浪线的拉丁文大写字母 O
Ö21400D6Ö带有分音符(diaeresis)的拉丁文大写字母 O
×21500D7×乘号(MULTIPLICATION SIGN)
Ø21600D8Ø带有删除线的拉丁文大写字母 O
Ù21700D9Ù带有重音符号(grave)的拉丁文大写字母 U
Ú21800DAÚ带有尖音符号(acute)的拉丁文大写字母 U
Û21900DBÛ带有抑扬音符号(circumflex)的拉丁文大写字母 U
Ü22000DCÜ带有分音符(diaeresis)的拉丁文大写字母 U
Ý22100DDÝ带有尖音符号(acute)的拉丁文大写字母 Y
Þ22200DEÞ拉丁文大写字母 THORN
ß22300DFß拉丁文小写字母 SHARP S
à22400E0à带有重音符号(grave)的拉丁文小写字母 a
á22500E1á带有尖音符号(acute)的拉丁文小写字母 a
â22600E2â带有抑扬音符号(circumflex)的拉丁文小写字母 a
ã22700E3ã带有波浪线的拉丁文小写字母 a
ä22800E4ä带有分音符(diaeresis)的拉丁文小写字母 a
å22900E5å带有上圆圈的拉丁文小写字母 a
æ23000E6æ拉丁文小写字母 AE
ç23100E7ç带有变音符号(cedilla)的拉丁文小写字母 c
è23200E8è带有重音符号(grave)的拉丁文小写字母 e
é23300E9é带有尖音符号(acute)的拉丁文小写字母 e
ê23400EAê带有抑扬音符号(circumflex)的拉丁文小写字母 e
ë23500EBë带有分音符(diaeresis)的拉丁文小写字母 e
ì23600ECì带有重音符号(grave)的拉丁文小写字母 i
í23700EDí带有尖音符号(acute)的拉丁文小写字母 i
î23800EEî带有抑扬音符号(circumflex)的拉丁文小写字母 i
ï23900EFï带有分音符(diaeresis)的拉丁文小写字母 i
ð24000F0ð拉丁文小写字母 ETH
ñ24100F1ñ带有波浪线的拉丁文小写字母 n
ò24200F2ò带有重音符号(grave)的拉丁文小写字母 o
ó24300F3ó带有尖音符号(acute)的拉丁文小写字母 o
ô24400F4ô带有抑扬音符号(circumflex)的拉丁文小写字母 o
õ24500F5õ带有波浪线的拉丁文小写字母 o
ö24600F6ö带有分音符(diaeresis)的拉丁文小写字母 o
÷24700F7÷除号(DIVISION SIGN)
ø24800F8ø带有删除线的拉丁文小写字母 o
ù24900F9ù带有重音符号(grave)的拉丁文小写字母 u
ú25000FAú带有尖音符号(acute)的拉丁文小写字母 u
û25100FBû带有抑扬音符号(circumflex)的拉丁文小写字母 u
ü25200FCü带有分音符(diaeresis)的拉丁文小写字母 u
ý25300FDý带有尖音符号(acute)的拉丁文小写字母 y
þ25400FEþ拉丁文小写字母 THORN
ÿ25500FFÿ带有分音符(diaeresis)的拉丁文小写字母 y

\0-\xa0之间的都是一些控制字符,不应该使用在web页面上,但是,它们毕竟是被定义为字符,如果使用windows操作系统,在windows的ANSI字符集中,他们有可能会被显示出来。

到这里你应该对sizzle定义的这个identifier正则清楚的理解了。它几乎完全是按照W3C的稳定定义实现的,除了多去除了一个空格外。


原创文章,转载请注明来自:妹纸前端-www.webfront-js.com.
阅读(5177)
辛苦了,打赏喝个咖啡
微信
支付宝
妹纸前端
妹纸前端工作室 | 文章不断更新中
京ICP备16005385号-1