我有以下格式的日期:
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/