选择(OR)|
前言
选择是正则表达式中的一个术语,实际上是一个简单的“或”。
在正则表达式中,它用竖线 |
表示。
例如,我们需要找出编程语言:HTML、PHP、Java 或 JavaScript。
对应的正则表达式为:html|php|java(script)?
。
一个小例子
let reg = /html|php|css|java(script)?/gi;
let str = "First HTML appeared, then CSS, then JavaScript, what is java or php?";
console.log(str.match(reg)); // [ 'HTML', 'CSS', 'JavaScript', 'java', 'php' ]
我们已知的一个相似符号 —— 方括号。就允许在许多字符中进行选择,例如 gr[ae]y
匹配 gray
或 grey
。
选择符号并非在字符级别生效,而是在表达式级别。正则表达式 A|B|C
意思是命中 A
、B
或 C
其一均可。
例如:
gr(a|e)y
严格等同gr[ae]y
。gra|ey
匹配 “gra” or “ey”。
我们通常用圆括号把模式中的选择部分括起来,像这样 before(XXX|YYY)after
。
时间正则表达式
在之前的章节中有个任务是构建用于查找形如 hh:mm
的时间字符串,例如 12:00
。但是简单的 \d\d:\d\d
过于模糊。它同时匹配 25:99
。
如何构建更优的正则表达式?
我们可以应用到更多的严格匹配结果中:
- 首个匹配数字必须是
0
或1
,同时其后还要跟随任一数字。 - 或者是数字
2
之后跟随[0-3]
。
构建正则表达式:[01]\d|2[0-3]
。
接着可以添加冒号和分钟的部分。
分钟的部分必须在 0
到 59
区间,在正则表达式语言中含义为首个匹配数字 [0-5]
其后跟随任一数字 \d
。
把它们拼接在一起形成最终的模式 [01]\d|2[0-3]:[0-5]\d
。
快大功告成了,但仍然存在一个问题。选择符 |
在 [01]\d
和 2[0-3]:[0-5]\d
之间。这是错误的,因为它只匹配符号左侧或右侧任一表达式。
let reg = /[01]\d|2[0-3]:[0-5]\d/g;
// 左边一半的规则 [01]\d
console.log("12".match(reg)); // [ '12' ]
// 右边一半的规则 2[0-3]:[0-5]\d
console.log("23:59".match(reg)); // [ '23:59' ]
这个错误相当明显,但也是初学正则表达式的常见错误。
我们需要添加一个插入语用于匹配时钟:[01]\d
或 2[0-3]
。
以下为正确版本:
let reg = /([01]\d|2[0-3]):[0-5]\d/g;
console.log("00:00 10:10 23:59 25:99 1:2 12".match(reg)); // [ '00:00', '10:10', '23:59' ]
总结
正则表达式中的方括号
[]
匹配的是一个一个的字符,比如:[ab]
,表示这个位置可以是a
或者是b
或
|
运算符匹配的是表达式,,比如:abc|efg
,匹配的是左边的abc
或者右边的efg
记住选择运算符最好用括号包裹一下,要不容易出错,比如:
js// 假如想匹配的是 abcg 或者 aefg,这么写就会出错 let reg = /abc|efg/ // 上面的表达式只会匹配 abc 或者 efg,因为或运算符匹配的是 表达式 // 左边的表达式是 abc // 右边的表达式是 efg // 有一个符合的就会返回结果 let reg = /a(bc|ef)g/ // 这样就会匹配到 abcg 或者 aefg 了