交替是正则表达式中的一个术语,实际上是一个简单的“或”。
在正则表达式中,它用竖线字符 |
表示。
例如,我们需要找到编程语言: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…)