【问题标题】:Validate a xs:duration using a regular expression in Javascript使用 Javascript 中的正则表达式验证 xs:duration
【发布时间】:2018-10-04 10:39:41
【问题描述】:

我正在尝试验证 xs:duration,然后将其转换为秒。这时候,这就是我所拥有的:

/P^([-])?(([\d.]*)Y)?(([\d.]*)M)?(([\d.]*)D)?T?(([\d.]*)H)?(([\d.]*)M)?(([\d.]*)S)?/

但是,不拒绝这些无效值(取自here):

  • P-20M 必须先出现减号
  • P20MT 没有时间项,所以不能出现“T”
  • P1YM5D 没有指定月份的值,因此不能使用“M” 呈现

我错过了什么?

我发现了一个类似的问题here,但该正则表达式仅适用于 Python。

【问题讨论】:

  • 你打算在XSD中使用它pattern吗?
  • 抱歉,我不太确定您在问什么。我从 XML 接收视频文件的持续时间,我想验证并将它们转换为秒。然后我将在我的 Javascript 代码中使用它来做一些计算,而不是使用任何特定的模式。
  • 您要求修改模式吗?它是如何使用的?在哪里?在你使用模式的地方显示代码。
  • 另外,模式不正确,它包含^ 作为第二个字符。如果我删除它,-P60D 不匹配,尽管据说应该匹配。请提供问题中应匹配和不应匹配的字符串列表。

标签: javascript regex xsd duration


【解决方案1】:

您遗漏了几点,通过查看失败案例的描述可以轻松解决这些问题。以下正则表达式适用于所有情况(和失败情况),请参阅Regex 101

^(-?)P(?=.)((\d+)Y)?((\d+)M)?((\d+)D)?(T(?=.)((\d+)H)?((\d+)M)?(\d*(\.\d+)?S)?)?$

首先看P15.5Y only the seconds can be expressed as a decimal。您在任何地方都使用[\d.]*,它允许在任何地方使用一个或多个数字或点。但是只有秒被允许有一个点,并且那个点需要跟一个数字。因此,将秒数更改为(\d*(\.\d+)?S),将所有其他秒数更改为(\d+Y)(以此类推)。

另外,字符串需要以可选的- 开头,然后是P,所以使用它:

^-?P

那么,P 之后肯定有什么东西,只需使用前瞻断言即可:

(?=.)

然后是YMD,如前所述。

如果有时间组件,现在必须有一个T,所以如果有其他东西出现,请确保我们有一个T

(T(?=.))

...只有当我们有T,我们才被允许有HMS

(T(?=.)(\d+H)?(\d+M)?(\d*(\.\d+)?S)?)

前瞻断言确保我们会找到一些东西,其余的则捕获 HMS 部分。

【讨论】:

  • 很棒的答案。像冠军一样工作。
  • 你从哪里得到这个正则表达式是你自己开发的,它是在任何许可下发布的吗?
猜你喜欢
  • 1970-01-01
  • 2014-07-30
  • 2020-08-12
  • 2013-08-24
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多