每年Stack Overflow上有超過1200萬個正則相關問題,但87%的開發(fā)者承認:他們至今靠復制粘貼活著。
這不是智商問題。正則表達式(Regular Expression,一種文本模式匹配規(guī)則)的設計初衷就是"寫一次,讀永遠"——1970年代貝爾實驗室的程序員Ken Thompson把它塞進Unix工具箱時,大概沒料到50年后還有人對著[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}發(fā)呆。
今天這份清單,從字符類到貪婪陷阱,每個例子都能直接丟進生產環(huán)境。建議收藏,下次面試前翻一遍。
字符類:比你想的更野
方括號[]是正則的入門磚,但大多數人只用到[0-9]這種基礎款。
真正省事的寫法藏在反斜杠里:\d等于[0-9],\w等于[a-zA-Z0-9_],\s匹配所有空白字符(空格、制表符、換行)。
Java玩家有個隱藏技能:[a-z&&[^aeiou]]這種"交集"語法能直接篩出小寫輔音字母。其他語言?老老實實寫[bcdfghjklmnpqrstvwxyz]吧。
一個實戰(zhàn)場景:提取駝峰命名里的每個單詞。[A-Z][a-z]+匹配"HelloWorld"會抓到"Hello"和"World"——大寫字母開頭,后面跟至少一個小寫字母。加號+的意思是"前面的東西出現1次或更多"。
電話號碼提取更典型:[0-9]{3}-[0-9]{4}里的{3}是精確計數,匹配"555-1234"這種格式。花括號是正則里最容易被忽略的量化工具,很多人只會用星號加號。
貪婪陷阱:90%的bug來源
正則引擎默認"能吃多少吃多少"。
看這組對比:模式<.+>遇到輸入bold,會一口吞下bold——從第一個<一直匹配到最后一個>。
加個問號?變成<.+?>,引擎立刻變乖:只匹配到第一個>就停,結果拆成和兩個獨立標簽。
這個?叫"懶惰量詞",和前面的可選含義完全不同。正則的上下文依賴性就是這么煩人——同一個符號在不同位置功能大變。
完整量詞表建議刻進肌肉記憶:
星號*:0次或多次(貪婪)
加號+:1次或多次(貪婪)
問號?:0次或1次(貪婪){n}:精確n次{n,}:至少n次{n,m}:n到m次
每個后面都能跟?變懶惰模式。處理HTML、JSON、日志文件時,懶惰量詞能救命——當然,正經解析這些格式應該用專用庫,正則只是應急。
生產環(huán)境直接復制的模式
郵箱驗證:[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
這個版本覆蓋了99%的合規(guī)郵箱,但別拿它當唯一校驗——RFC 5322規(guī)定的合法郵箱格式復雜到能寫本書,實際注冊流程還得發(fā)驗證郵件。
URL提取:https?://[^\s]+
s?讓s變成可選,匹配http和https;[^\s]是"非空白字符"的簡寫,一直抓到空格為止。
國內手機號:1[3-9]\d{9}
第二位限定3-9排除虛擬號段,\d{9}補足剩余9位。比網上流傳的各種冗長版本干凈得多。
日志時間戳:\d{4}-\d{2}-\d{2}
ISO 8601基礎日期格式,年月日各就各位。需要兼容時間的話擴展為\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}。
調試比寫更重要
DevPlaybook的regex playground有個功能被低估了:實時高亮+分組可視化。
寫復雜模式時,把匹配結果按捕獲組著色,能立刻發(fā)現哪段邏輯在吞字符。比盯著黑底白字的測試輸出高效十倍。
另一個冷知識:多數語言支持(?#注釋)語法。生產代碼里的正則建議寫成
(?#協議)https?://(?#域名)[^\s]+
三個月后回來看,你會感謝自己。
最后留一道題:模式(\d)\1+能匹配什么?提示和"捕獲組"有關,答案藏在大多數教程的附錄里——而附錄,恰恰是高手和新手的分水嶺。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.