原文链接:http://javascript.info/regexp-alternation,translate with ❤️ by zhangbao.
在正则表达式里,”或“用垂直线字符 | 表示。
例如,我们想要找到编程语言: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';alert( str.match(reg) ); // HTML,CSS,JavaScript
我们之前已经学到过一个类似的结构——方括号。允许在众多的字符里选择一个,例如,gr[ae]y 匹配 gray 或者 grey。
| 符号作用的范围不是字符级别的,而是表达式级别的。正则 A|B|C 表示匹配表达式 A、B 和 C 里面的任意一个。
例如:
gr(a|e)y等同于gr[ae]y。gra|ey表示匹配”gra“或者”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。
几乎已经完成了,但是有一个问题。或 | 出现在 [0-1]\d 和 2[0-3]:[0-5]\d。这错了,因为它匹配的是左边或者右边部分:
let reg = /[01]\d|2[0-3]:[0-5]\d/g;alert("12".match(reg)); // 12 (匹配到了 [01]\d)
这是相当明显的,但在开始使用正则表达式时,仍然经常出现这种错误。
我们需要添加括号来准确地应用可选的时间:[01]\d 或 2[0-3]。
正确的正则:
let reg = /([01]\d|2[0-3]):[0-5]\d/g;alert( '00:00 10:10 23:59 25:99 1:2'.match(reg) ); // 00:00,10:10,23:59
(完)
