處理中文文本時,多位元組編碼 (Big5/GBK/UTF-8) 讓正則表達式庫面臨嚴峻挑戰。本文深度評測主流庫的中文支援現狀,並分享自製多位元組相容正則引擎的關鍵設計思路。
| 庫 | 多位元組 | Unicode | 語法完整度 | 效能 | 評價 |
|---|---|---|---|---|---|
| GNU Regex | ❌ 不支援 | ❌ | 完整 | 中 | 解析階段即非法操作,不可用 |
| ATL (VC7+) | ⚠️ 部分 | ✅ 完善 | 缺 {n,m}、遞迴 | 高 | 原始碼清晰,易修改支援 MBCS |
| Greta (MS) | ❌ 無實作 | ✅ 完善 | 完整 | 高 | cpp 實現分離導致單/雙位元組二選一,可改 .inl 解決 |
| Boost.Regex | ✅ (新版) | ✅ | 完整 | 高 (近期優化 10x) | 功能最強,但使用複雜度高 |
| PCRE | ✅ (UTF-8 模式) | ✅ | Perl 相容 | 極高 | Apache/PHP/Python 採用,**首選推薦** |
| Lua Pattern | ✅ | ✅ | 獨特語法 | 極高 | 嵌入極易,語法非標準 regex |
| Ruby/Onigmo | ✅ 原生 | ✅ | 強大 | 高 | 日語開發,東亞字元支援最佳,嵌入需 MRuby |
需求範例:`/漢字[ ]+[^ ,,]+[ ]*[,,][ ]*[^ ,,]+` 匹配 `/漢字 蘭征鵬 ,正則表達式`。
`std::basic_string` 僅預設特化 `char`/`wchar_t`,無內建多位元組迭代器。`std::search` 直接用於 MBCS 會匹配到漢字內碼片段(如三個漢字中間四個位元組)。
作者嘗試自製解析器,面臨的語義決策:
^ 單行模式:僅匹配字串開頭,中間出現視為語法錯誤?^ 多行模式:匹配行首 (含 `\n` 後) 還是僅字串開頭?$ 多行模式:匹配行尾 (含 `\n` 前) 還是字串結尾?^$ 空行匹配:語法錯誤?匹配空字串?匹配 `\n\n` 間的空行?不同工具 (grep/VC/UE) 行為不一,需參考 POSIX/Perl 標準並明確文件化。
需要標準 regex 語法?
├─ 是 → PCRE (UTF-8) / Boost.Regex / Onigmo (Ruby)
│ └─ 嵌入輕量? → PCRE 靜態連結
└─ 否 → Lua Pattern / 自製簡易解析器
└─ 極簡需求 → 手寫狀態機 / strstr 變體