gpt4 book ai didi

ISO 8601 持续时间的正则表达式

转载 作者:行者123 更新时间:2023-12-04 05:02:57 24 4
gpt4 key购买 nike

我需要一个正则表达式来验证 ISO 8601 duration format 中的持续时间(除了我不需要的小数部分)。

PnYnMnDTnHnMnS

PnW


这是我所拥有的:
^P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(\d+H)?(\d+M)?(\d+S)?)?$
唯一的问题是字符串 PPT允许使用此正则表达式,因为所有部分都是“零或一” ? .
  • 至少需要一个组件(日期或时间)
  • 如果有 T那么需要有一个时间分量(H、M 或 S)
  • 如果有 T那么可能有也可能没有任何日期分量(Y、M 或 D)
  • 允许溢出(例如 P72H 大部分等同于 P3D )

  • 可接受的输入:
    P1Y        // date component only
    P2MT30M // date and time components
    PT6H // time component only
    P5W // another date component
    Not Acceptable 输入:
    P         // no components
    PT // no components
    P3MT // T specified but not time components
    现在无效的字符串正在通过客户端验证但在服务器端失败,因为它被传递到 DateInteval 但如果可能的话,我想在客户端失败。如果每个人都使用 Chrome 40+,我可以指定 minlength='3'在输入元素上提供帮助,但不幸的是情况并非如此。

    最佳答案

    如果你几乎所有的部分都是可选的,但你想确保在 P 之后还有别的东西或 T ,您可以使用前瞻:

    ^P(?=\d+[YMWD])(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(?=\d+[HMS])(\d+H)?(\d+M)?(\d+S)?)?$
    ^^^^^^^^^^^^ ^^^^^^^^^^^^

    它们需要一个数字序列,后跟一个来自指定集合的​​字母,才能紧跟在前面的模式之后。

    demo

    更新

    P可以为“空”,使用
    ^P(?!$)(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(?=\d+[HMS])(\d+H)?(\d+M)?(\d+S)?)?$

    another demo .在这里, (?!$)确保字符串不等于 P ,而且右边一定还有一些其他的符号。

    或者,正如@UlugbekUmirov 所暗示的那样,它是 enough to just use T(?=\d) (因为所有可选部分都以数字开头):
    ^P(?!$)(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?$

    更新 2

    如果数字既可以是浮点数也可以是整数,则添加 (?:\.\d+)?每个之后 \d+ .这是更新 1 中的更新模式:
    ^P(?!$)(\d+(?:\.\d+)?Y)?(\d+(?:\.\d+)?M)?(\d+(?:\.\d+)?W)?(\d+(?:\.\d+)?D)?(T(?=\d)(\d+(?:\.\d+)?H)?(\d+(?:\.\d+)?M)?(\d+(?:\.\d+)?S)?)?$

    关于ISO 8601 持续时间的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32044846/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com