代码之家  ›  专栏  ›  技术社区  ›  theJuls

使用regex检查可选字符集

  •  2
  • theJuls  · 技术社区  · 6 年前

    我的日期格式如下:

    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 回复  |  直到 6 年前
        1
  •  2
  •   Wiktor Stribiżew    6 年前

    将空格放入组中:

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

    看到了吗 regex demo .

    注意我也认为 [^.]+ 必须是 [^,]+ ,除 逗号 .

    你可以把图案进一步缩短到

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

    请注意,将文字空间替换为 \s+

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

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

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