Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Regex Error ใน C++: รหัสข้อผิดพลาดและการจัดการ Exception

ไลบรารี <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_badrepeatQuantifier (*, +, ?, {}) ไม่มี Pattern ก่อนหน้า (เช่น *abc)
error_complexityComplexity ของการ Match เกินขีดจำกัด (ป้องกัน ReDoS)
error_rangeRange ใน Character Class ไม่ถูกต้อง (เช่น [z-a])
error_badbraceBrace {} ไม่จับคู่ (เช่น a{1,)
error_braceRange ใน Brace ไม่ถูกต้อง (เช่น a{5,3})
error_parenParentheses () ไม่จับคู่
error_brackBrackets [] ไม่จับคู่ (เช่น [abc)
error_backrefBack-reference ไม่ถูกต้อง (เช่น \9 แต่มีแค่ 8 Group)
error_escapeEscape 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 จากภายนอก