【问题标题】:RegEx expression that will match Date format将匹配日期格式的正则表达式
【发布时间】:2017-05-14 09:12:43
【问题描述】:

我与"1999-08-16"^^xsd:date 有联系。将整个字符串捕获为"1999-08-16"^^xsd:datein flex 文件的正则表达式是什么?而且,是否可以仅将“1999-08-16”捕获为字符串。如果是,那么它在 flex 中的正则表达式是什么?

【问题讨论】:

  • 匹配日期的简单正则表达式是/[0-9]{4}-[0-9]{2}-[0-9]{2}/,它将匹配格式为 4digit-2digit-2digit 的任何数字,其中还包括无效日期,例如 0000-99-99
  • 现在我可以使用\"[0-9]{4}-[0-9]{2}-[0-9]{2}\" 捕获"1999-08-16"。但是,如果我想将整个字符串捕获为"1999-08-16"^^xsd:date,那么正则表达式会是什么?我试过\"[0-9]{4}-[0-9]{2}-[0-9]{2}\"\^\^"xsd:date" 但没有用。

标签: regex bison flex-lexer


【解决方案1】:

试试这个:

^"(\d{4}-(?:0?[1-9]|1[012])-(?:30|31|[12]\d|0?[1-9]))"\^\^xsd:date$

解释:

  • ^ - 行首
  • \d{4} - 年份部分
  • (?:0?[1-9]|1[012]) - 月,可以是:
    • 01-09 或 1-9(这就是为什么0?
    • 10,11,12(1[012] 部分)
  • ?: 表示非捕获组(如果我们只需要交替匹配 |,但不输出给用户)
  • (?:30|31|[12]\d|0?[1-9]) - 白天部分,可以是:
    • 30,31,
    • 10-29(部分[12]\d
    • 1-9,或 01-09 (0?[1-9])
      我们还使用非捕获组来匹配日期
  • $ 匹配行尾
  • "" 之间的所有内容都被捕获到标准捕获组,因为您需要提取日期

Demo

注意: 在匹配天数时,我们将 1-9 天数放入 LAST 交替组:

(?:30|31|[12]\d|0?[1-9])

这是因为当给定交替匹配时,正则表达式引擎使用第一个匹配结果,而其他匹配的替代方案被忽略。例如- 在字符串1 11 表达式中:

  • (?:\d{2}|\d) 提供 2 个匹配项
  • (?:\d|\d{2}) 提供 3 个匹配项

【讨论】:

    【解决方案2】:

    可以使用\"[0-9]{4}-[0-9]{2}-[0-9]{2}\"\^\^[^ ]*捕获整个字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多