javascript - 使用正则表达式检查可选字符集

标签 javascript regex regex-group

我有以下格式的日期:

October 4, 2019 10:30 am

此日期需要分为月、日、年和时间。其中时间是可选的。换句话说,这也应该是有效的:

October 4, 2019

不幸的是,如果我确实尝试从字符串中省略时间,那么在使用以下模式时我会得到未定义的结果:

const match = /(\w+)( [^.]+)?, ([0-9]{4}) ((?:0[1-9]|1[0-2]):[0-9]{2} (?:am|pm))?/.exec(dt);

我希望它可以在有或没有时间部分的情况下工作,如我在示例字符串中显示的那样。我查找了一些具有相同问题的线程,根据我的理解,这应该适用于 ?

那么对于这种情况,我做错了什么?

谢谢

最佳答案

可选组之前的空格仍然是必需的,因此与第二个字符串不匹配。

将空间放入组中:

/(\w+)( [^,]+)?, ([0-9]{4})( (?:0[1-9]|1[0-2]):[0-9]{2} (?:am|pm))?/ 
                            ^

请参阅regex demo

注意,我还认为 [^.]+ 必须是 [^,]+,即除逗号之外的任何 1 个或多个字符.

您可以进一步缩短模式至

/(\w+)( [^,]+)?, (\d{4})( (?:0[1-9]|1[0-2]):\d{2} [ap]m)?/

请注意,用 \s+ 替换文字空格以匹配任何 1+ 空格可能是个好主意,并且不用担心输入中是否存在硬空格或常规空格:

/(\w+)(\s+[^,]+)?,\s+(\d{4})(\s+(?:0[1-9]|1[0-2]):\d{2}\s+[ap]m)?/

关于javascript - 使用正则表达式检查可选字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52648723/

相关文章:

javascript - 如何检查事件是否被触发?

javascript - 使用正则表达式将带有制表符的文本转换为有效的 JSON

php - 如何借助 preg_replace 替换子字符串

objective-c - NSTextFinder 和正则表达式搜索

java - 如何为某些场景制作正则表达式模式

regex - 具有正向回顾的复杂 (PHP) 正则表达式

javascript - 具有数千个可观察值的 Knockout.js 表单对浏览器性能的影响

javascript - 有没有办法在 Javascript 中顺序执行语句?

javascript - 格式化 AJax 调用返回的 Json 并将其分配给 javascript 变量

javascript - 正则表达式 : Pound Sign at beginning of word