仅当两个部分都存在时,正则表达式才允许使用分隔符

时间:2014-09-22 18:47:35

标签: regex datetime regex-lookarounds

目前我正在编写一个正则表达式来验证日期时间字符串。基本格式是

(Date)(?: *,?)(Time) 

我已经计算出正则表达式的日期和时间部分就好了,但我无法让正则表达式允许所有这三种情况:

  • 日期,没有分隔符,没有时间
  • 日期,分隔符和时间
  • 没有日期,没有分隔符和时间

简单的方法(使所有三个部分都可选)具有允许案例

的意外副作用
  • 没有日期和分隔符,没有时间

这可以通过环顾来实现吗?

示例有效输入:

  • January 25 2004, 10:30 PM
  • 2004-1-25
  • 10:30 PM

输入无效:

  • ,

(日期和时间正则表达式处理了一堆案例,我已经解决了这个问题 - 它阻止了无效案例,同时允许我仍然需要的所有三种形式。)

3 个答案:

答案 0 :(得分:2)

如果您将分隔符包含日期或时间组,则分隔符本身将不匹配:

^(DATE(?: *,? *))?(TIME)?$

它有一个可选的日期和分隔符,后跟一个可选的时间。

请参阅演示:http://regex101.com/r/dH6nI2/1

答案 1 :(得分:0)

您可以使用替换:

((Date)((?: *,?)(Time))?|((Date)(?: *,?))?(Time))

虽然会导致一些重复。

答案 2 :(得分:0)

我想我找到了一个有效的解决方案。我在开头使用前瞻来验证它不是以分隔符开头...然后使分隔符成为时间段的可选部分。

/^(?=[A-Za-z0-9])(Date)(?:(?:Separator)?(Time))$/

例如,要使用YYYY-MM-DD格式的日期和格式HH:ii和分隔符, *| +(可选逗号和一个或多个空格)的时间来验证日期时间,它会是

/^(?=[0-9])(?:([0-9]{4})-([0-9]{2})-([0-9]{2}))?(?:(?:, *| +)?([0-9]{2}:[0-9]{2}))?$/