簡體   English   中英

使用Java中的正則表達式驗證xs:duration

[英]Validate a xs:duration using a regular expression in Javascript

我正在嘗試驗證xs:duration,然后將其轉換為秒。 目前,這就是我所擁有的:

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

但是,不會拒絕這些無效值(從此處獲取 ):

  • P-20M負號必須首先出現
  • P20MT沒有時間項,因此“ T”一定不能存在
  • P1YM5D數月未指定任何值,因此不能存在“ M”

我想念什么?

我在這里找到了類似的問題,但是該正則表達式僅適用於Python。

您遺漏了幾個要點,只需查看故障案例的描述即可輕松解決。 以下正則表達式適用於所有情況(和失敗情況),請參閱正則表達式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部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM