【问题标题】:Regex for extracting time from natural language string用于从自然语言字符串中提取时间的正则表达式
【发布时间】:2019-10-26 18:24:02
【问题描述】:

在我的逻辑中,我需要一个字符串变量保存在数据库中,该字符串实际上是某种时间格式,通过以下方式自定义 toString 变量:

(days)d(hours)h(minutes)m

示例 2 天 15 小时半 =>2d15h30m

我想确保没有人在期望提交该格式并提供另一种格式的文本输入上进行巨魔,我一直很糟糕构建模式和正则表达式,有人可以帮我快速解决这个问题吗?

我自己试过了:

([0-9]{1}|[0-9]{1}|[0-9]{1})d([0-1]{1}[0-9]{1}|20|21|22|23)h([0-5]{1}|[0-9]{1})m

但它没有成功,就像我每次尝试构建其中一个一样。

【问题讨论】:

  • (\d+)d([01]?\d|2[0-3])h([0-5]?\d)m
  • 我想你可以使用pattern="\d+d(?:0?[1-9]|1\d|2[0-3])h[0-5]?\dm"0d0h0m 有效吗?
  • 嘿,感谢两位的快速回答,没有 0d0h0m 这是唯一不可能的结果,至少它应该包含 1 分钟 (0d0h1m) 我忘了说对不起......我'我不习惯在这里问我会改进的!

标签: javascript regex time


【解决方案1】:

你可以使用

pattern="(?=[^1-9]*[1-9])\d+d(?:[10]?[0-9]|2[0-3])h[0-5]?\dm"

查看regex demoregex graph

在 HTML5 pattern 属性正则表达式中,此模式将用于编译以下正则表达式:^(?:(?=[^1-9]*[1-9])\d+d(?:[10]?[0-9]|2[0-3])h[0-5]?\dm)$

匹配

  • ^(?: - 字符串的开始和非捕获容器组的开始
  • (?=[^1-9]*[1-9]) - 正向前瞻,要求输入中至少有一个非零数字
  • \d+d - 1+ 个数字和一个 d 字符后
  • (?:[10]?[0-9]|2[0-3])h - 可选的10 后跟一个数字,或2 后跟一个从03 的数字,两者都后跟h
  • [0-5]?\dm - 从05 的可选数字,后跟任意数字和m
  • )$ - 容器组结束和字符串锚点结束。

【讨论】:

    猜你喜欢
    • 2019-09-03
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    相关资源
    最近更新 更多