为几个匹配创建正则表达式

时间:2010-02-02 11:04:51

标签: regex

我将测试一个日期字符串,看它是否是这三个中的一个: dd-mm-yyyy或yyyy OR dd-mm-yyyy / dd-mm-yyyy

我已将这三个结合起来,但最后一个会造成麻烦,因为我不能只使用\ Q / \ E来匹配单个“/”。

[0-9]{2}-[0-9]{2}-[0-9]{4}                                -> dd-mm-yyyy
[0-9]{4}                                                  -> yyyy
[0-9]{2}-[0-9]{2}-[0-9]{4}\Q/\E[0-9]{2}-[0-9]{2}-[0-9]{4} -> dd-mm-yyyy/dd-mm-yyyy

他们将结合使用这个表达式:

([0-9]{2}-[0-9]{2}-[0-9]{4}|[0-9]{4}|[0-9]{2}-[0-9]{2}-[0-9]{4}\Q/\E[0-9]{2}-[0-9]{2}-[0-9]{4})

问题1:如何在日期之间只允许一个“/”?

问题2:在正则表达式和$结尾处,^意味着什么?而且应该 我有它在我的

溴。安德斯

更新:(基于下面的答案和评论)谢谢!两个正确答案。我标记了最后一个,因为还有一个更平滑的方式来写我试图做的事情。

语言可能是XSLT或C#。我在CMS Umbraco中放置了一个正则表达式来验证默认的texstring / input字段。

它有点滑稽。如果我在开头添加^,则没有区别,因此我的问题就是这个。

此字符串有效:^(?:\ d {4} | \ d {2} - \ d {2} - \ d {4}(?:/ \ d {2} - \ d {2} - ?\ d {4}))$

2 个答案:

答案 0 :(得分:1)

如果您告诉我们您正在使用哪种正则表达式变体或编程语言,这将有所帮助。我现在假设perl。

  • 问题1:使用反斜杠(\)将其转义:\/
  • 问题2:^表示输入的开始,$表示结束。使用两种方法匹配与我的查询完全匹配的行,在开头或结尾没有其他内容。由于您要匹配日期字符串,而不是字符串中包含日期,因此在查询中使用它们

答案 1 :(得分:1)

由于您没有指定语言,我建议使用Perl版本:

/^(?:\d{4}|\d{2}-\d{2}-\d{4}(?:\/\d{2}-\d{2}-\d{4})?)$/

模式解释:

  • 从字符串
  • 的第一个字符开始
  • 寻找4位数(\d{4}
  • 一系列two digits dash two digits dash four digits
  • 可选a slash two digits dash two digits dash four digits
  • 匹配字符串的结尾以确保没有其他内容

我引用了文字/编写\/,因为它是最常用的跨语言方式:在Perl中,选择不同的模式分隔符就足以避免转义。