正则表达式[Jj]ack可以匹配字符串“Jack”或者“jack”。该正则表达式还可以使用替换来实现同样的匹配效果。如下正则表达式等效于正则表达式[Jj]ack。
Jack|jack (59)
如下正则表达式等效于正则表达式Jack|jack。因此,正则表达式[Jj]ack、Jack|jack和Jack|jack能够匹配的所有字符串是相同。
(J|j)ack (60)
使用工具Regex Tester分别测试正则表达式[Jj]ack和(60),结果分别如图2.21和2.22所示。从图中可以看到,两个正则表达式匹配的结果是相同的。
正则表达式的常用替换说明如表2-7所示。
表2-7 常用替换
字符或表达式 | 说明 |
| | 匹配|(竖线)字符的左侧或右侧。 |
(?(表达式)yes|no) | 表达式要么可以匹配“yes”部分匹配;要么与“no”部分匹配。其中,“no”部分可省略。 |
(?(name)yes|no) | 以name命名的字符串要么匹配“yes”部分匹配;要么与“no”部分匹配。其中,“no”部分可省略。 |
注意:字符|在匹配表达式时,它首先匹配|字符的左侧部分。当左侧部分不匹配时,它才尝试匹配|字符的右侧部分。
给定以下两个正则表达式
/d{5}-/d{3}|/d{5} (61)
/d{5}|/d{5}-/d{3} (62)
根据字符|的匹配原则(优先匹配左侧表达式),正则表达式/d{5}|/d{5}-/d{3}只会匹配5位的数字字符串,而不会匹配用连接符合连接的8位数字字符串。然而,正则表达式/d{5}-/d{3}|/d{5}能够匹配用连接符合连接的8位数字字符串或者5位的数字字符串。因为,该表达式首先尝试匹配用连接符合连接的8位数字字符串,只有当未匹配时,才匹配5位的数字字符串。
使用工具Regex Tester分别测试了正则表达式(61)和(62),测试结果分别如图2.23和2.24所示。正则表达式/d{5}|/d{5}-/d{3}只匹配了字符串“12345”。而正则表达式/d{5}-/d{3}|/d{5}可以匹配字符串“12345-678”和字符串“12345”。