使用正则表达式

时间:2018-10-04 14:03:14

标签: javascript regex regex-group

我有一个以下格式的日期:

  

2019年10月4日上午10:30

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

  

2019年10月4日

不幸的是,如果我确实尝试从字符串中省去时间,那么在使用以下模式时我将无法定义:

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

我希望这与我在示例字符串中显示的有时间部分或无时间部分一起工作。我一直在寻找一些具有相同问题的线程,据我所知,这应该适用于?

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

谢谢

2 个答案:

答案 0 :(得分:2)

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

将空格放入组中

/(\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)?/

答案 1 :(得分:1)

上面的注释解决方案有效,但是它在组中包含空格,这意味着如果将它们用作变量,它们将具有空格。下面的解决方案应将所有空格排除在组外。

(\w+) ([^,]+)?, ([0-9]{4})\s?([01]\d:\d\d+ am|pm)?