我写了一个正则表达式,以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$
答案 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