【问题标题】:One type of delimiter in one date time string in RegExRegEx 中一个日期时间字符串中的一种分隔符
【发布时间】:2010-07-05 20:15:54
【问题描述】:

有没有办法编写一个正则表达式,它只能在一个日期时间字符串中验证一种类型的分隔符?

例如,30/04/2010 是正确的,但 30-04/2010 是不正确的。

我用谷歌搜索了一些关于回溯的信息,但我不太确定如何使用它。例如,如果我有这个正则表达式:

(?P<date>((31(?![\.\-\/\—\ \,\–\-]{1,2}(Feb(ruary)?|Apr(il)?|June?|(Sep(?=\b|t)t?|Nov)(ember)?)))|((30|29)(?![\.\-\/\—\ \,\–\-]{1,2}Feb(ruary)?))|(29(?=[\.\-\/\—\ \,\–\-]{1,2}Feb(ruary)?[\.\-\/\—\ \,\–\-]{1,2}(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))|(0?[1-9])|1\d|2[0-8])[\.\-\/\—\ \,\–\-]{1,2}(Jan(uary)?|Feb(ruary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sep(?=\b|t)t?|Nov|Dec)(ember)?)[\.\-\/\—\ \,\–\-]{1,2}((1[6-9]|[2-9]\d)\d{2}))

那我应该如何在这里使用回溯?

非常感谢。

【问题讨论】:

  • 您为什么要这样做?让您的用户以任何可以理解的方式输入日期。 “30-04/2010”显然是2010年第30个月的第4天,所以你应该接受它。 ;-) 帮助用户,不要与她对抗。
  • 假设我们有这个字符串 09/07-10/12。我希望正则表达式匹配 09/07 和 10/12 作为两个日期。否则,09/07-10 可能会被误认为是一个日期。

标签: php regex datetime date delimiter


【解决方案1】:

不是您的问题的答案,但您是否考虑过使用strtotime()?

这是一个非常灵活的函数,可以解析任何英文日期和时间:

Feb 2, 2010
February 2, 2010
02/02/10
4 weeks ago
Next Monday

如果日期不可解析,该函数将返回 false(或 PHP 5.1 之前的 -1)。

有一些陷阱 - 我想我记得在使用 xx-xx-xxxx 表示法时,它倾向于假定欧洲的 DD-MM-YYYY 日期 - 但总而言之,使用它可能比使用正则表达式要好得多。

【讨论】:

  • 谢谢,08/2010 怎么样?我尝试过,但 php 无法解析该格式。假设我们有这个字符串 09/07-10/12。我希望正则表达式匹配 09/07 和 10/12 作为两个日期。否则,09/07-10 可能会被误认为是一个日期。
  • @James 是的,它无法解析08/2010(如果有帮助,它会正确解析August 2010。)但是在没有特定规则集的情况下匹配09/07-10/12 之类的东西将非常复杂一个正则表达式。你能添加更多关于你的确切情况的细节吗?你能在输入中强加某种形式吗?
【解决方案2】:

虽然 Pekka 的回答可以更好地解决您的问题,但我认为值得回答您的这部分问题:

那我应该如何在这里使用回溯?

以下是匹配“05-07-2010”和“05/07/2010”但不匹配“05-07/2010”的正则表达式示例:

"#^\d{2}([/-])\d{2}\1\d{4}$#"
        ------     --

正则表达式中最重要的部分带有下划线; \1 这里是对第一个捕获子模式 ([/-]) 的反向引用。您可以在 PHP 手册的Back references 章节中获得更多信息。

【讨论】:

    【解决方案3】:

    您拥有的正则表达式似乎检查字符串是否采用日期时间可以采用的任何可能格式。 如果您只想检查您给定的示例 30/04/2010,您可以使用这个简单的

    ([\d]{1,2})/([\d]{1,2})/([\d]{2,4})

    (日月1-2位,年2-4位)

    【讨论】:

    • 谢谢,但这只是一个例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2019-06-07
    • 2019-03-31
    相关资源
    最近更新 更多