首頁 > 軟體

如何使用正規表示式對輸入數位進行匹配詳解

2022-10-12 14:01:42

前言:

最近有一個區間範圍限制,一般255數位以下的都能在網上薅到,但是需要弄一個int16、int32、int64範圍的輸入限制......在網上逛了很久都沒找到,基本都是從0開始教學那種,我又不想看,覺得寫的範圍太大了,我就單純的對數位進行校驗,最終還是研究了一點點,先說說自己的理解,0如有覺得不對的地方或者還有更簡單的方法,請大佬踢我一jio

正文:

下面會使用到一些元字元,邊做邊解釋。

舉例:做一個int8的輸入限制,也是就是需要將輸入框的限制設定在(-128 ~ 127)

先說0~127的限制範圍:

首先需要先寫 ^ $ 兩個元字元,這兩個的意思就是開始與結束的字串搭配。如匹配 0~5的整數位符串,則就是 ^ [0-5]$ (中括號為字元範圍,匹配指定範圍內的任意字元。例如,'[a-z]' 可以匹配 'a' 到 'z' 範圍內的任意小寫字母字元)。

那如果是 0~15呢,15就是兩個字元,需要從右邊往左拆分,當第一位數位為1時,第二位數值的取值範圍就只能是0~5,所以出現了第一種組合方式 1[0-5],當第一位為0時,也就是不顯示十位,只存在個位數,那麼第二種組合方式就是[0-9],結合第一種和第二種的組合方式,^(1[0-5]|[0-9])$ 中間的|符號可以理解為或運輸,就是既可以匹配1[0-5]的數位,也可以匹配[0-9]的數位,圓括號可以理解為一個組合。此處使用Qt測試程式碼為:

因為元字元中:

d

匹配一個數位字元。等價於 [0-9]。

所以此處的 "^(1[0-5]|[0-9])$" 組合方式可以縮寫成 "^(1[0-5]|d)$",因為在Qt中使用d好像被識別成跳脫字元了,提示如下面一樣:

所以需要將 d 寫成 \d ,即為  "^(1[0-5]|\d)$"

 那麼,至此 0~15 整數的正規表示式就寫完了,如果我們這裡需要寫  -15~15 的取值範圍又該怎麼弄呢? 一樣的只需要將 0~15照著抄過來就行。先寫成"^((-1[0-5]|\d)|(1[0-5]|\d))$",大家會發現我寫了兩次0~15的取值範圍,中間用到了“|”或運運算元,在最左側加了一個“-”負號,給人的感覺好像是-15~15,但是這裡左側的取值範圍存在0的情況,也就是左邊的會出現 -0 的匹配,是因為左邊的 \d包含了 0~9的數位,這裡麵包含了0,所以我們不想要這種情況的出現,只需要將左邊的 \d改為 [1-9]就可以啦,所以-15~15 的匹配方式為 "^((-1[0-5]|[1-9])|(1[0-5]|\d))$"

當然這只是我的簡單理解,可能會存在更好的方式,避免左右兩側重複的匹配字串太多,而又做不到複用的情況,也請大佬指出。

最後我們要來匹配一個 int16的取值範圍,因為int16的範圍為整數 -32768 ~ 32767,所以我們一開始還是先寫右邊 0~32767的範圍,因為寫出了右邊後(32767),再將左邊( -32768)加個符號,對左邊的個位數情況(-0)做出處理,就可以啦。

首先0~32767 當前面為3276時,個位數只能匹配 0~7 : 3276[0-7]

0~32767 當前面為327時,後兩位只能匹配 小於60的數位,也就是0~59,即個位數匹配 0~9,十位數匹配 0~5 : 327[0-5][0-9]  或則 327[0-5]\d

0~32767 當前面為32時,後三位只能匹配 小於700的數位,也就是0~699,即個位數匹配 0~9,十位數匹配 0~9,百位數匹配 0~6 : 32[0-6][0-9][0-9]  或則 32[0-6]\d\d  也可以簡寫成 32[0-6]\d{2}  花括號為前面一個字元重複的次數,這裡也就是\d必須要重複2次。下面是花括號的使用講解。

{n}

n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。

{n,}

n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。

{n,m}

m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。

0~32767 當前面為3時,後四位只能匹配 小於2000的數位,也就是0~1999,即個位數匹配 0~9,十位數匹配 0~9,百位數匹配 0~9,千位數匹配0~1 : 3[0-1][0-9][0-9][0-9]  或則 3[0-1]\d\d\d  也可以簡寫成 3[0-1]\d{3}。

0~32767 當存在5位數位,也就是輸入數位為萬位的時候,那麼現在萬位只能存在1~2(因為3已經在前面匹配過來,這裡不需要繼續匹配3的情況了),後四位就可以全匹配0~9,因為只要存在5個數,且萬位數位又是1~2的範圍內,所以個位、十位、百位、千位再大也不可能會超過30000的 ,即個位數匹配 0~9,十位數匹配 0~9,百位數匹配 0~9,千位數匹配0~9 : [1-2][0-9][0-9][0-9][0-9]  或則 [1-2]\d\d\d\d  也可以簡寫成 [1-2]\d{4}。

0~32767 當存在4位元數位,也就是輸入數位為千位的時候,那麼現在千位就能存在1~9,後面的百位、十位、個位的取值情況可以為0~9,即千位存在[1-9]\d\d\d,百位存在[1-9]\d\d,十位位存在[1-9]\d,(這裡個位為一個數位的情況,留到最後處理)這麼組合下來就是 [1-9]\d\d\d|[1-9]\d\d|[1-9]\d,這樣匹配沒有問題,但是展示不太好,所以這裡用到花括號簡寫為:  [1-9]\d{1,3}  花括號1~3的意思就是匹配\d至少一次,最多3次。

0~32767 當只存在1位數位,也就是隻輸出個位的時候,即\d或者[0-9]。

所以結合上面的匹配結果  0~32767的匹配公式為

"^(3276[0-7]|327[0-5]\d|32[0-6]\d{2}|3[0-1]\d{3}|[1-2]\d{4}|[1-9]\d{1,3}|\d)$"

那麼同理-32768 ~ -1,因為不存在-0的情況,而前面0~32767已經匹配了0,所以此處只匹配到-1。即:

"^-(3276[0-8]|327[0-5]\d|32[0-6]\d{2}|3[0-1]\d{3}|[1-2]\d{4}|[1-9]\d{0,3})$"

那麼-32768 ~ 32767的匹配公式,也就是int16的匹配公式為

"^(-(3276[0-8]|327[0-5]\d|32[0-6]\d{2}|3[0-1]\d{3}|[1-2]\d{4}|[1-9]\d{0,3})|(3276[0-7]|327[0-5]\d|32[0-6]\d{2}|3[0-1]\d{3}|[1-2]\d{4}|[1-9]\d{1,3}|\d))$"

同理,int32(-2147483648 ~ 2147483647)、int64(-9223372036854775808 ~ 9223372036854775807)也可以按照這樣的方式匹配,當然這只是我簡單看了一下後的理解,可能存在還有更簡單的方法,歡迎各位大佬賜教。

總結

到此這篇關於如何使用正規表示式對輸入數位進行匹配的文章就介紹到這了,更多相關正規表示式對輸入數位匹配內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com