您可以通过将块放置在( ... )?
This 中来使其成为可选块,这相当于( ... ){0,1}
允许零个或一个引用。
你的表达变成:
/([0-2][0-9])((.|:)([0-5][0-9]))?/
这匹配12
,12:30
和12.30
。它不会匹配5
, 5:30
, 或5.30
. 可以通过使第一位数字可选来启用单个数字小时输入:
/([0-2]?[0-9])((.|:)([0-5][0-9]))?/
如果你使用.match
,你会注意到你有 5 个结果:
["12:30", "12", ":30", ":", "30"]
您可以通过消除不必要的匹配来减少到 3 当你( ... )
变成(?: ... )
/([0-2]?[0-9])(?:(?:.|:)([0-5][0-9]))?/
这给了你:
["12:30", "12", "30"]
更新
根据您的更新,您希望匹配边界。有几种方法可以做到这一点。
- 开始
^
会将表达式的前面与每行/字符串的开头联系起来。
- 以结尾结尾
$
会将表达式的结尾与字符串的结尾联系起来。
- 开始或结束
\b
将要求边缘反对“边界”。
把所有这些放在一起:
如果您只想匹配只包含您可以使用的日期的行:
/^([0-2]?[0-9])(?:(?:.|:)([0-5][0-9]))?$/
这不会捕获“hello 1.30”或“1.30 hello”。
如果要匹配以日期开头的行,可以使用:
/^([0-2]?[0-9])(?:(?:.|:)([0-5][0-9]))?/
但这将匹配“1.30000”。
如果您要在行首寻找日期,最好的选择是:
/^([0-2]?[0-9])(?:(?:.|:)([0-5][0-9]))?\b/
因为它将匹配“1.30 测试”但不匹配“1.300000”。不幸的是,它也会匹配“1.30.30”,但这是 JavaScript 的 RegExp 处理器的限制。
如果您正在寻找字符串中的时间,这将变为:
/\b([0-2]?[0-9])(?:(?:.|:)([0-5][0-9]))?\b/
它将“test 1.30 test”与“.10.10.10”之类的不幸匹配情况相匹配。