自己在實際工作過程中,發現正則用到的地方很多,而且寫的好的正規表示式可以在達到同樣效果的情況下更簡潔美觀,效能也更佳。本人對於正則是十分推崇喜愛的,也一直在學習此的過程中,其中也有一些心得體會,藉此分享給大家。
^[1-9]\d(18|19|([2-3]\d))\d((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d(\d|x|x)$`
相比[1-9]\d(\d|x|x)
,看似麻煩不少,可能有人會覺得沒有必要,用後面那種不是更簡便嗎,但是我們就只看7,8位,相比以前的2個\d,使用18,19,2和3開頭的正則,只需要匹配相當於原來1/5作用的內容,這裡就可以少匹配80%,更何況還有一些其他情況,很多時候都是幾個數量級的優化量,所以正則匹配效能優化時由優化表示式帶來的優化量十分可觀。
另外從上訴正則不斷優化過程中,不難總結出一些書寫正規表示式時的行之有效的經驗:
1、先做加法,再做減法:一開始用正則進行匹配界定時,可以先將範圍放寬些,然後慢慢做減法,一步步縮減範圍。如上面匹配身份證號碼時,我們一開始完全可以用[1-9]\d(\d|x|x)
這種完全不考慮身份證號碼各位數規則,只考慮數字這樣的表示式,目的是為了保證我們的正確率(無漏匹配),因為正確率是第一位的,如果連正確率都不能保證(存在漏匹配),那我們的正則一開始就是錯的,何談優化,優化得再怎麼完美都是白搞。
2、按部就班,循序漸進:在做減法的時候,要按照我們能獲取到的條件,一步步,一層層地」改進「我們的正規表示式,初用正則時,切不可想著一步到位,一開始就在那裡空想,想直接一下子就把所有內容都完成,這是不切實際的,或者說是一開始使用正則時極難達到的。我們在解決問題的時候,可以將問題分為乙個個小問題,分為很多小部分,一點點剖析開來,就像前面的身份證號碼正則,我們完全可以將其分為前6位,中8位,倒數234位,末尾這四個部分,一點點分析,乙個個解決。正如小時候學過的莫頓·亨特的文章《走一步,再走一步》(原名《懸崖上的一課》),就不怕遇到難題,也可以極大的提公升正確率。
3、留有餘地,正如我們平時做事時一樣,很多時候考慮和解決問題都需要我們留有餘地,留有「操作」空間,就像前面考慮年份時,雖然我們在限定20實際的時候,完全可以限定200,201,202這三個開頭(表示2000-2023年間),因為還有10年才會出現其他情況(本文寫於2023年),儘管包含了所有目前2023年及之後的情況,但是未免限定的太過於狹窄,所以我們限定時包含了所有的2和3開頭的情況,倒不是說我們想讓我們的正則使用週期能有幾千年跨度這麼久,而是想體現一種前瞻性思維,目的是降低漏匹配率,延長正規表示式的生命週期。
4、多做多練,所謂熟能生巧,做任何事都一樣,每個人的天賦可能會有所差別,一開始入手時會有所差異,但勤能補拙,我們可以通過不斷地練習來提公升我們的熟練度。那些熟練應用書寫高效率正則的人,也都是從一開始的懵懂,通過不停地實踐、練習提公升自己的技能水平,才到達融會貫通的水平的。
寫在最後:自己在正則方面也談不上駕輕就熟,像非捕獲型括號(?:…)相對於普通括號()對於記憶體的優化、較為複製正則的書寫等方面,至今還又很大不住,寫這篇文章是講述一些自己的心得體會,希望大家能夠一起成長!
數字驗證正則繞過
error reporting 0 flag flag if post server request method password while true if c 3 break 3,必須包含四種型別三種與三種以上 4 弱型別比較,42abc,強制轉換為數字 if 42 password echo...
js 關於數字的驗證
js判斷輸入是否為正整數 浮點數等數字的函式2010 12 10 17 42js判斷輸入是否為正整數 浮點數等數字的函式 js判斷輸入是否為正整數 浮點數等數字的函式 學習js的朋友可以參考下。1.下面列出了一些判讀數值型別的正規表示式 複製 如下 d 非負整數 正整數 0 0 9 1 9 0 9 ...
js使用正則驗證數字
正則驗證最多兩位小數 var reg new regexp 0 9 0 9 if reg.test sjd 驗證數字的正規表示式集 驗證數字 0 9 驗證n位的數字 d 驗證至少n位數字 d 驗證m n位的數字 d 驗證零和非零開頭的數字 0 1 9 0 9 驗證有兩位小數的正實數 0 9 0 9 ...