交替是正则表达式中的一个术语,实际上是一个简单的“或”。
在正则表达式中,它用竖线字符 | 表示。
例如,我们需要找到编程语言:HTML、PHP、Java 或 JavaScript。
相应的正则表达式:html|php|java(script)?。
一个使用示例
let regexp = /html|php|css|java(script)?/gi;
let str = "First HTML appeared, then CSS, then JavaScript";
alert( str.match(regexp) ); // '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。
要将交替应用于模式的选定部分,我们可以将其括在括号中。
I love HTML|CSS匹配I love HTML或CSS。I love (HTML|CSS)匹配I love HTML或I love CSS。
示例:时间正则表达式
在之前的文章中,有一个构建正则表达式的任务,用于搜索 hh:mm 格式的时间,例如 12:00。但是简单的 \d\d:\d\d 太模糊了。它接受 25:99 作为时间(因为 99 分钟匹配模式,但该时间无效)。
我们如何构建更好的模式?
我们可以使用更细致的匹配。首先,是小时部分
- 如果第一个数字是
0或1,那么下一个数字可以是任何数字:[01]\d。 - 否则,如果第一个数字是
2,那么下一个数字必须是[0-3]。 - (不允许其他第一个数字)
我们可以使用交替在正则表达式中编写这两种变体:[01]\d|2[0-3]。
接下来,分钟必须在 00 到 59 之间。在正则表达式语言中,可以写成 [0-5]\d:第一个数字 0-5,然后是任何数字。
如果我们将小时和分钟粘合在一起,我们将得到模式:[01]\d|2[0-3]:[0-5]\d。
我们快完成了,但有一个问题。交替 | 现在恰好发生在 [01]\d 和 2[0-3]:[0-5]\d 之间。
也就是说:分钟被添加到第二个交替变体中,这里有一个清晰的图片
[01]\d | 2[0-3]:[0-5]\d
该模式查找 [01]\d 或 2[0-3]:[0-5]\d。
但这是错误的,交替应该只用于正则表达式的“小时”部分,以允许 [01]\d 或 2[0-3]。让我们通过将“小时”括在括号中来纠正这一点:([01]\d|2[0-3]):[0-5]\d。
最终解决方案
let regexp = /([01]\d|2[0-3]):[0-5]\d/g;
alert("00:00 10:10 23:59 25:99 1:2".match(regexp)); // 00:00,10:10,23:59
评论
<code>标签,对于多行代码,请将其包裹在<pre>标签中,对于超过10行的代码,请使用沙盒(plnkr,jsbin,codepen…)