正则表达式 - 日期格式不使用混合分隔符

时间:2018-02-01 21:38:17

标签: regex

我写了一个正则表达式,以dd / mm / yyyy或dd.mm.yyyy的形式标识日期,但它目前接受dd / mm.yyyy作为正确的格式但我不想要混合分隔符被认为是有效的。我如何修改我的正则表达式来解决这个问题。

我的正则表达式是:

^(0[1-9]|[12][0-9]|3[01])[/|./.](0[1-9]|1[012])[/./.](19|20)\d\d$

3 个答案:

答案 0 :(得分:2)

使用预测来要求使用相同的分隔符:

^(?=.*([/.]).*\1)<your regex here>$

表达式(?=.*([/.]).*\1)是向前看,包含第一个分隔符\1的后引用[/.],这意味着它必须在输入中稍后重复。

整个正则表达式(将分隔符表达式简化为[/.]):

^(?=.*([/.]).*\1)(0[1-9]|[12][0-9]|3[01])[/.](0[1-9]|1[012])[/.](19|20)\d\d$

答案 1 :(得分:2)

尝试

^(?:0[1-9]|[12][0-9]|3[01])(\/|\.)(?:0[1-9]|1[012])\1(19|20)\d\d$

这将匹配

  

2018年1月2日

  

2018年1月2日

但不会匹配

  

01 / 02.2018

\1匹配第一个括号中的相同内容,在这种情况下为(\/|\.)。这称为“反向参考”。所以第二个分隔符必须重复第一个括号中的匹配。

通过使用(?:)代替普通(),它会阻止括号被计为匹配模式以进行反向引用,这样可以更容易编码,这对性能也更好,因为任何事情都可以在普通括号中将存储在内存中以备反向参考。因此,如果您使用括号来覆盖模式,则应使用(?:)

答案 2 :(得分:1)

解决 PHP Python

正则表达式^(?:[0-2][0-9]|3[01])(?:(\/)|\.)(?:0[1-9]|1[0-2])(?(1)\/|\.)(?:19|20)\d{2}$

<强>详情:

  • ()非捕获组
  • []捕获小组
  • |匹配列表中的单个字符
  • (?(1))
  • 01/12/1999 true 25.12.1999 true 23.12/1999 false 23/12.1999 false 23,12/1999 false If Clause,Group 1。

<强>输出

    CREATE TABLE STACKOVERFLOW
    ( 
    AccessionNumber nvarchar(max),
    TestName nvarchar(max),
    Result nvarchar(max)
    )

    INSERT INTO STACKOVERFLOW
    VALUES ('K09035053', 'Organism', 'Rhodococcus equi'),
    ('K09035053', 'Timentin', 'Susceptible'),
    ('K09035053', 'Erythromycin', 'Susceptible'),
    ('K09035053', 'Sulfa-Drugs', 'Resistant')

    SELECT * FROM STACKOVERFLOW

    SELECT * FROM
    (
    SELECT AccessionNumber, TestName, Result
    FROM STACKOVERFLOW) AS SOURCETABLE
    PIVOT
    (
      MAX(Result)
      FOR TestName In ([Organism], [Timentin], [Erythromycin], [Sulfa-Drugs])
    ) AS PIVOTTABLE