正則表達式是文本模式匹配的利器,但各語言方言差異大,死記關鍵字無濟於事。本文以醫院 MIS 系統中「驗證合法日期」為實戰案例,手把手演示如何在 VC6 環境下整合 Boost.Regex,構建一個能精準識別閏年、月份天數、多種分隔符的「終極日期正則」。
VC6 無原生正則支援,ATL 的 CATLRegExp 僅限 VC.NET。推薦方案:使用 Boost.Regex(業界公認最高效)。步驟:
libs/regex/build 目錄,執行 nmake vc6.mak 編譯靜態/動態庫.lib、.dll 複製至專案目錄,設定包含路徑與庫路徑^\\d{4}[\\s\\.-/]\\d{1,2}[\\s\\.-/]\\d{1,2}$僅檢查三組數字格式,4003.9/12、3344.0.40 均誤判為合法。
類別一:非 2 月、30/31 天
(?:(?:0?[1,3-9]|1[0-2])-(?:29|30)|((?:0?[13578]|1[02])-31))
類別一:全月 1-28 天
(?:0?[1-9]|1[0-2])-(?:0?[1-9]|1\\d|2[0-8])
類別三:閏年 2 月 29 日
需精準編碼閏年規則:能被 4 整除但不能被 100 整除、或能被 400 整除。
四位數尾兩位為 4 的倍數:\\d\\d(?:0[48]|[2468][048]|[13579][26])
整百年能被 400 整除:(?:0[48]00|[2468][048]00|[13579][26]00)
合併後:((?:(\\d\\d(?:0[48]|[2468][048]|[13579][26]))|(?:0[48]00|[2468][048]00|[13579][26]00))-0?2-29)
^(?:([0-9]{4}-(?:(?:0?[1,3-9]|1[0-2])-(?:29|30)|((?:0?[13578]|1[02])-31)))|
([0-9]{4}-(?:0?[1-9]|1[0-2])-(?:0?[1-9]|1\\d|2[0-8]))|
(((?:(\\d\\d(?:0[48]|[2468][048]|[13579][26]))|(?:0[48]00|[2468][048]00|[13579][26]00))-0?2-29)))$
測試通過:2004-02-29、2004-2-29 ✅;2007-2-29 ❌;格式固定 ####-##-##。
[1:00 AM]、[12:00 PM]、[1:00am] 等格式將高頻正則封裝為 DLL,專案中直接調用,提升複用效率。理解正則的關鍵在於「識別文本字符模式」而非死記語法,深入鑽研後方覺其優美。