網(wǎng)站首頁 編程語言 正文
前言:
最近有一個區(qū)間范圍限制,一般255數(shù)字以下的都能在網(wǎng)上薅到,但是需要弄一個int16、int32、int64范圍的輸入限制......在網(wǎng)上逛了很久都沒找到,基本都是從0開始教學(xué)那種,我又不想看,覺得寫的范圍太大了,我就單純的對數(shù)字進(jìn)行校驗,最終還是研究了一點點,先說說自己的理解,0如有覺得不對的地方或者還有更簡單的方法,請大佬踢我一jio
正文:
下面會使用到一些元字符,邊做邊解釋。
舉例:做一個int8的輸入限制,也是就是需要將輸入框的限制設(shè)置在(-128 ~ 127)
先說0~127的限制范圍:
首先需要先寫 ^ $ 兩個元字符,這兩個的意思就是開始與結(jié)束的字符串搭配。如匹配 0~5的整數(shù)字符串,則就是?^ [0-5]$ (中括號為字符范圍,匹配指定范圍內(nèi)的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范圍內(nèi)的任意小寫字母字符)。
那如果是 0~15呢,15就是兩個字符,需要從右邊往左拆分,當(dāng)?shù)谝晃粩?shù)字為1時,第二位數(shù)值的取值范圍就只能是0~5,所以出現(xiàn)了第一種組合方式 1[0-5],當(dāng)?shù)谝晃粸?時,也就是不顯示十位,只存在個位數(shù),那么第二種組合方式就是[0-9],結(jié)合第一種和第二種的組合方式,^(1[0-5]|[0-9])$ 中間的|符號可以理解為或運輸,就是既可以匹配1[0-5]的數(shù)字,也可以匹配[0-9]的數(shù)字,圓括號可以理解為一個組合。此處使用Qt測試代碼為:
因為元字符中:
\d | 匹配一個數(shù)字字符。等價于 [0-9]。 |
所以此處的 "^(1[0-5]|[0-9])$" 組合方式可以縮寫成?"^(1[0-5]|\d)$",因為在Qt中使用\d好像被識別成轉(zhuǎn)義字符了,提示如下面一樣:
所以需要將 \d 寫成 \\d ,即為? "^(1[0-5]|\\d)$"
?那么,至此 0~15 整數(shù)的正則表達(dá)式就寫完了,如果我們這里需要寫? -15~15 的取值范圍又該怎么弄呢? 一樣的只需要將 0~15照著抄過來就行。先寫成"^((-1[0-5]|\\d)|(1[0-5]|\\d))$",大家會發(fā)現(xiàn)我寫了兩次0~15的取值范圍,中間用到了“|”或運算符,在最左側(cè)加了一個“-”負(fù)號,給人的感覺好像是-15~15,但是這里左側(cè)的取值范圍存在0的情況,也就是左邊的會出現(xiàn) -0 的匹配,是因為左邊的 \\d包含了 0~9的數(shù)字,這里面包含了0,所以我們不想要這種情況的出現(xiàn),只需要將左邊的 \\d改為 [1-9]就可以啦,所以-15~15 的匹配方式為?"^((-1[0-5]|[1-9])|(1[0-5]|\\d))$"
當(dāng)然這只是我的簡單理解,可能會存在更好的方式,避免左右兩側(cè)重復(fù)的匹配字符串太多,而又做不到復(fù)用的情況,也請大佬指出。
最后我們要來匹配一個?int16的取值范圍,因為int16的范圍為整數(shù) -32768 ~ 32767,所以我們一開始還是先寫右邊?0~32767的范圍,因為寫出了右邊后(32767),再將左邊( -32768)加個符號,對左邊的個位數(shù)情況(-0)做出處理,就可以啦。
首先0~32767 當(dāng)前面為3276時,個位數(shù)只能匹配 0~7 :?3276[0-7]
0~32767 當(dāng)前面為327時,后兩位只能匹配 小于60的數(shù)字,也就是0~59,即個位數(shù)匹配 0~9,十位數(shù)匹配 0~5?:?327[0-5][0-9]? 或則?327[0-5]\\d
0~32767 當(dāng)前面為32時,后三位只能匹配 小于700的數(shù)字,也就是0~699,即個位數(shù)匹配 0~9,十位數(shù)匹配 0~9,百位數(shù)匹配 0~6?:?32[0-6][0-9][0-9]? 或則 32[0-6]\\d\\d? 也可以簡寫成 32[0-6]\\d{2}? 花括號為前面一個字符重復(fù)的次數(shù),這里也就是\\d必須要重復(fù)2次。下面是花括號的使用講解。
{n} | n 是一個非負(fù)整數(shù)。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。 |
{n,} | n 是一個非負(fù)整數(shù)。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價于 'o+'。'o{0,}' 則等價于 'o*'。 |
{n,m} | m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價于 'o?'。請注意在逗號和兩個數(shù)之間不能有空格。 |
0~32767 當(dāng)前面為3時,后四位只能匹配 小于2000的數(shù)字,也就是0~1999,即個位數(shù)匹配 0~9,十位數(shù)匹配 0~9,百位數(shù)匹配 0~9,千位數(shù)匹配0~1?:?3[0-1][0-9][0-9][0-9]? 或則 3[0-1]\\d\\d\\d? 也可以簡寫成 3[0-1]\\d{3}。
0~32767 當(dāng)存在5位數(shù)字,也就是輸入數(shù)字為萬位的時候,那么現(xiàn)在萬位只能存在1~2(因為3已經(jīng)在前面匹配過來,這里不需要繼續(xù)匹配3的情況了),后四位就可以全匹配0~9,因為只要存在5個數(shù),且萬位數(shù)字又是1~2的范圍內(nèi),所以個位、十位、百位、千位再大也不可能會超過30000的?,即個位數(shù)匹配 0~9,十位數(shù)匹配 0~9,百位數(shù)匹配 0~9,千位數(shù)匹配0~9?:?[1-2][0-9][0-9][0-9][0-9]? 或則 [1-2]\\d\\d\\d\\d? 也可以簡寫成 [1-2]\\d{4}。
0~32767 當(dāng)存在4位數(shù)字,也就是輸入數(shù)字為千位的時候,那么現(xiàn)在千位就能存在1~9,后面的百位、十位、個位的取值情況可以為0~9,即千位存在[1-9]\\d\\d\\d,百位存在[1-9]\\d\\d,十位位存在[1-9]\\d,(這里個位為一個數(shù)字的情況,留到最后處理)這么組合下來就是?[1-9]\\d\\d\\d|[1-9]\\d\\d|[1-9]\\d,這樣匹配沒有問題,但是展示不太好,所以這里用到花括號簡寫為:? [1-9]\\d{1,3}? 花括號1~3的意思就是匹配\\d至少一次,最多3次。
0~32767 當(dāng)只存在1位數(shù)字,也就是只輸出個位的時候,即\\d或者[0-9]。
所以結(jié)合上面的匹配結(jié)果 ?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已經(jīng)匹配了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)也可以按照這樣的方式匹配,當(dāng)然這只是我簡單看了一下后的理解,可能存在還有更簡單的方法,歡迎各位大佬賜教。
總結(jié)
原文鏈接:https://blog.csdn.net/qq_40160455/article/details/121980704
相關(guān)推薦
- 2022-07-29 redis秒殺系統(tǒng)的實現(xiàn)_Redis
- 2022-05-22 Nginx基礎(chǔ)location語法及功能配置實例_nginx
- 2022-08-27 python基礎(chǔ)篇之pandas常用基本函數(shù)匯總_python
- 2022-07-09 Docker網(wǎng)絡(luò)介紹
- 2022-03-25 在NET?Core?中獲取?CPU?使用率_ASP.NET
- 2022-03-14 瀏覽器獲取不到服務(wù)器端添加的Cookie
- 2022-08-20 Python?實現(xiàn)一個全連接的神經(jīng)網(wǎng)絡(luò)_python
- 2022-04-16 論文查重python文本相似性計算simhash源碼_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支