ไลบรารี <regex> ใน C++ สามารถโยน Exception ชนิด std::regex_error เมื่อพบรูปแบบ Regular Expression ที่ไม่ถูกต้อง การเข้าใจรหัสข้อผิดพลาด (Error Codes) ช่วยให้ Debug ได้รวดเร็วขึ้น
ตารางรหัสข้อผิดพลาดหลัก (std::regex_constants::error_type)
| Error Code | ความหมาย |
|---|---|
error_collate | ชื่อ Collation ไม่ถูกต้องใน Character Class (เช่น [[:invalid:]]) |
error_ctype | ชื่อ Character Class ไม่ถูกต้อง (เช่น [:alpha:] ขาดวงเล็บ) |
error_stack | หน่วยความจำไม่พอสำหรับ Stack ระหว่าง Matching |
error_space | หน่วยความจำไม่พอสำหรับสร้าง Finite State Machine |
error_badrepeat | Quantifier (*, +, ?, {}) ไม่มี Pattern ก่อนหน้า (เช่น *abc) |
error_complexity | Complexity ของการ Match เกินขีดจำกัด (ป้องกัน ReDoS) |
error_range | Range ใน Character Class ไม่ถูกต้อง (เช่น [z-a]) |
error_badbrace | Brace {} ไม่จับคู่ (เช่น a{1,) |
error_brace | Range ใน Brace ไม่ถูกต้อง (เช่น a{5,3}) |
error_paren | Parentheses () ไม่จับคู่ |
error_brack | Brackets [] ไม่จับคู่ (เช่น [abc) |
error_backref | Back-reference ไม่ถูกต้อง (เช่น \9 แต่มีแค่ 8 Group) |
error_escape | Escape Sequence ไม่ถูกต้อง หรือ Escape ตัวสุดท้าย (เช่น \ ท้ายสตริง) |
ตัวอย่างการจับ Exception
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main() {
try {
// ผิด: [A-Z][0 -> ขาด ] ปิดท้าย
std::regex re("[A-Z][0");
}
catch (const std::regex_error& err) {
cout << "Regex Error: " << err.what() << '\n';
cout << "Error Code: " << err.code() << '\n';
// ตรวจสอบรหัสเฉพาะ
if (err.code() == std::regex_constants::error_brack) {
cout << "Error: Mismatched brackets []" << endl;
}
}
return 0;
}
ผลลัพธ์
Regex Error: Unexpected character in bracket expression
Error Code: 10 // error_brack
Error: Mismatched brackets []
แนวทางปฏิบัติที่ดี
- ใช้
try-catchครอบการสร้างstd::regexจาก User Input - Validate Regex Pattern ก่อนใช้งานจริง (Regex Tester Tools)
- หลีกเลี่ยง Pattern ที่ซับซ้อนเกินไป (Catastrophic Backtracking)
- พิจารณาใช้
std::regex_constants::ECMAScript(Default) หรือ Grammar อื่นที่เหมาะสม
สรุป
std::regex_error ให้ข้อมูลรายละเอียดสำหรับการ Debug Regex Pattern การรู้จัก Error Codes ต่างๆ ช่วยให้แก้ไขปัญหาได้เร็วขึ้น และควรมี Exception Handling เสมอเมื่อรับ Pattern จากภายนอก