【问题标题】:Check for optional set of characters using regex使用正则表达式检查可选字符集
【发布时间】:2018-10-04 14:03:14
【问题描述】:

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

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);

我希望这可以使用或不使用示例字符串中显示的时间部分。我已经寻找了一些具有相同问题的线程,据我了解,这应该适用于?

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

谢谢

【问题讨论】:

  • 这太棒了!也是学习正则表达式的好网站。非常感谢!

标签: javascript regex regex-group


【解决方案1】:

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

将空间放入组中:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多