【问题标题】:Regex to find week date正则表达式查找星期日期
【发布时间】:2018-07-11 13:21:53
【问题描述】:

我们从客户那里收到一个文件,我们需要读取该文件并将一些值保存到我们的 ERP 系统中。

客户以周格式向我们发送日期,例如:201814 这表示 2018 年的第 14 周

客户永远不会在文件中的同一个地方发送这个日期,所以我想我能得到这个日期的唯一方法是通过正则表达式搜索文件中的字符串。

我的正则表达式可能包含以下条件:

  • 字符串的长度始终为 6 个字符
  • 所有字符都是数值
  • 字符串始终以20 开头
  • 最后两个值必须介于0153 之间

完美的正则表达式是什么?文件中还有许多其他“仅限数字”的值,这就是为什么我需要如此具体

我知道我可以像 {1,6} 这样的长度条件,我知道 [0-9] 匹配从零到九的所有数字,但我看不出如何将 01 限制为 53。

有人可以帮我处理我的正则表达式吗?非常感谢!

【问题讨论】:

  • 最后两个值是什么意思? 2018xx 这个xx?
  • 你必须分开每场比赛\b20[0-9]{2}(?:0[1-9]|[1-4][0-9]|5[123])\b
  • @SimonS 你没有提到正则表达式的味道吗?即哪种语言?
  • @RizwanM.Tuman 这是 C#
  • @SimonS 顺便说一句,考虑到您的情况,我已经提供了一个答案,这能解决您的问题吗?

标签: regex


【解决方案1】:

你可以试试这个:

\b20\d{2}(?:0[1-9]|[1-4]\d|5[0-3])(?!\d)

Demo

解释:

  1. \b字符串指示符的字边界开始
  2. 20 字面量必须以 20 开头
  3. \d{2} 后跟任意两位数

  4. (?:非捕获组从这里开始

  5. 0[1-9] 表示 01 到 09

  6. [1-4]\d 表示 10 到 49

  7. 5[0-3] 表示 50-53

  8. ) 非捕获组结束

  9. (?!\d) 负前瞻确保不跟随整个匹配 一个数字。整个正则表达式的形成方式是您不需要测量 6 位数字;如果不是 6 位,则不满足上述条件。

【讨论】:

  • 你可以用 \b 开始和结束你的表达来验证它是一个单词,那么你就不需要 (?!\d)
  • 好吧,我知道,但是假设在现实世界中,如果意外出现像 201852ZZZZ 这样的输入......即使这样也行,不是吗?但是,你可能会认为我也应该考虑在开始时做同样的事情......这是重点......你可能会在这里称我有点懒 :) !但我没有这样做,因为我不确定 op 的首选语言是否支持后向显示.. 我刚刚发现它支持
【解决方案2】:

使用这个:(20)\d{2}([1-4][0-9]|[0][1-9]|[5][1-3])

Demo

【讨论】:

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