簡體   English   中英

驗證格式化的“時間”

[英]Validating a formatted “time”

我想驗證一個嚴格格式化的“時間”。 該“時間”具有以下形式:

\d+d \d+h \d+m

其中“ d”代表天,“ h”代表小時,“ m”代表分鍾,每個數字的最小值為“ 1”。 主要問題是每個子串可能存在或可能不存在,但始終至少會有一個。 此外,它們必須按照上面指定的順序。

我下面的RegEx是驗證格式的最佳方法嗎? RegEx是簡潔與速度之間的最佳平衡嗎?

(?=.+)^(?:(?:[1-9]|[1-9][0-9]+)d\s?)?(?:(?:[1-9]|1[0-9]|2[0-3])h\s?)?(?:(?:[1-9]|[1-5][0-9])m)?$

我提供了前瞻性以確保空字符串不匹配。

我看到的唯一一個小問題是,如果沒有連續的“ m”值,則類似“ 23h”的內容將匹配。 “ d”也是如此。

這是一種經過優化的模式,可以嚴格檢查您描述的格式:

^(?=\S)(?:[1-9][0-9]*d)?(?:(?:^| )(?:1[0-9]?|[3-9]|2[0-3]?)h)?(?:(?:^| )(?:[1-5][0-9]?|[6-9])m)?$

細節:

(?=\\S)確保模式中至少有一組,並強制字符串不以空格開頭。

[1-9][0-9]*d(?:[1-9]|[1-9][0-9]+)d快,因為字符類[1-9]僅測試一次。

(?:1[0-9]?|[3-9]|2[0-3]?)(?:[1-9]|1[0-9]|2[0-3])但效率更高,因為第一個數字僅測試一次。 備選方案按概率排序

對於[1-5][0-9]?|[6-9]

我假設組必須用空格隔開。 為了確保這一點,我已刪除\\s? 在第1組和第2組的末尾將(?:^| )放在第2組和第3組的開始處。只有兩種可能:該組在開始處,或者在前面還有另一個組和一個空格

您將獲得更長的模式(一個字符),但速度更快且綁定更多。 如果出於晦澀的原因需要減小圖案的大小,則可以使用舊的子圖案為組2和3中的數字獲得3個字符。

暫無
暫無

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

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