首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC6 實戰正則表達式:用 Boost.Regex 精準驗證日期格式

     編輯:關於VC++

正則表達式是文本模式匹配的利器,但各語言方言差異大,死記關鍵字無濟於事。本文以醫院 MIS 系統中「驗證合法日期」為實戰案例,手把手演示如何在 VC6 環境下整合 Boost.Regex,構建一個能精準識別閏年、月份天數、多種分隔符的「終極日期正則」。

環境搭建:VC6 + Boost.Regex

VC6 無原生正則支援,ATL 的 CATLRegExp 僅限 VC.NET。推薦方案:使用 Boost.Regex(業界公認最高效)。步驟:

  1. 下載 Boost(文中用 1.32.0 版)
  2. 進入 libs/regex/build 目錄,執行 nmake vc6.mak 編譯靜態/動態庫
  3. 將產出的 .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 ❌;格式固定 ####-##-##。

常用正則速查表

  • Email:支援 IP 域名與標準域名,含長度與字元限制
  • 時間:[1:00 AM]、[12:00 PM]、[1:00am] 等格式
  • URL:涵蓋 http/https/ftp、IP 與域名、端口、路徑參數

工程化建議

將高頻正則封裝為 DLL,專案中直接調用,提升複用效率。理解正則的關鍵在於「識別文本字符模式」而非死記語法,深入鑽研後方覺其優美。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved