匹配除日期之外的任何其他内容

时间:2011-10-27 16:07:33

标签: regex

我正在使用下面的REGEX来有效地检查字符串是否是YYYY-MM-DD日期。

[0-9]{4}-[0-9]{2}-[0-9]{2}

如何执行相反操作并使用类似的REGEX检查字符串不是此格式的日期。

4 个答案:

答案 0 :(得分:1)

您可以使用否定前瞻来解决此问题:

 (?![0-9]{4}-[0-9]{2}-[0-9]{2})

编辑:在看了卢卡斯的帖子之后,我已经制作了一个新的正则表达式来进行更严格的验证。

  • 年份可以是4位数的任意组合,例如允许1900年前的日期
  • 月份在1-12
  • 范围内
  • 1-31天的日子,
  • 以YYYY-MM-DD格式验证

新正则表达式:

(?!([0-9]{4})-([1-9]|0[1-9]|1[012])-([1-9]|0[1-9]|[12][0-9]|3[01]))

答案 1 :(得分:1)

你的正则表达式只匹配一个有效日期(例如“3333-99-99”),你可以使用更长的表达式:

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

如果你想匹配除日期之外的所有东西,请使用负面预测,如Marcus所写:

^(?!((19[0-9][0-9]|20[0-9][0-9])-([1-9]|0[1-9]|1[012])-([1-9]|0[1-9]|[12][0-9]|3[01])))$

正则表达式来自this link

答案 2 :(得分:0)

import datetime
try:
    datetime.datetime.strptime('2011-10-27','%Y-%m-%d')
except ValueError:
    print 'The string is NOT in the right format'
else:
    print 'The string is in the right format'

确实这不是正则表达式,但它可能表现更好 - 可能值得基准测试......

答案 3 :(得分:0)

首先,你的正则表达式不能确保字符串 是一个日期,只是包含一个。如果你想确保字符串只包含 日期(根据你的表述),你需要锚定它:

^[0-9]{4}-[0-9]{2}-[0-9]{2}$

...并且确保日期的字符串的最简单方法是尝试将其与该正则表达式匹配并取消结果。你如何做到这一点取决于语言;在C#中你可以这样做:

if ( !Regex.IsMatch(s, "^[0-9]{4}-[0-9]{2}-[0-9]{2}$") )

如果必须使用正则表达式本身进行检查(例如,如果您使用的是基于正则表达式的简单验证控件),则可以使用否定前瞻,正如其他响应者所建议的那样:

^(?![0-9]{4}-[0-9]{2}-[0-9]{2}$).*

从字符串的开头开始(由于^),前瞻会尝试匹配日期后跟字符串结尾($)。如果失败,匹配位置将重置为开头,.*继续前进并消耗整个字符串。