การใช้เรกุลาร์เอ็กเพรสชัน

C++:
การใช้เรกุลาร์เอ็กเพรสชัน

วิธีการ:

C++11 ได้เพิ่มการสนับสนุนนิพจน์ปรกติในไลบรารีมาตรฐาน, <regex>, โดยนำเสนอกรอบงานที่มั่นคงสำหรับการค้นหาและการจัดการสตริง นี่คือตัวอย่างพื้นฐานของการใช้นิพจน์ปรกติในการค้นหารูปแบบภายในสตริง:

#include <iostream>
#include <regex>

int main() {
    std::string target = "Hello, my email is [email protected]";
    std::regex email_pattern(R"(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b)");

    if (std::regex_search(target, email_pattern)) {
        std::cout << "พบอีเมล!" << std::endl;
    } else {
        std::cout << "ไม่พบอีเมล." << std::endl;
    }

    return 0;
}

ผลลัพธ์ตัวอย่าง

พบอีเมล!

สำหรับการจัดการที่ซับซ้อนมากขึ้น เช่น การแทนที่รูปแบบภายในสตริง นิพจน์ปรกติของ C++ สามารถใช้ได้ประโยชน์มาก:

#include <iostream>
#include <regex>

int main() {
    std::string text = "The rain in Spain falls mainly in the plain.";
    std::regex vowel_regex("([aeiou])");

    std::string replaced_text = std::regex_replace(text, vowel_regex, "*");
    std::cout << replaced_text << std::endl;

    return 0;
}

ผลลัพธ์ตัวอย่าง

Th* r**n *n Sp**n f*lls m**nly *n th* pl**n.

สำหรับโปรแกรมเมอร์ที่สำรวจนอกไลบรารีมาตรฐาน เลือกใช้ไลบรารี Boost Regex (boost/regex.hpp) เป็นทางเลือกยอดนิยมจากบุคคลที่สามที่มอบความสามารถรูปแบบปรกติที่เพิ่มขึ้นและการปรับให้เหมาะสมด้านประสิทธิภาพ โดยเฉพาะสำหรับรูปแบบที่ซับซ้อนหรือการประมวลผลข้อมูลขนาดใหญ่:

#include <iostream>
#include <boost/regex.hpp>

int main() {
    std::string s = "Boost libraries are fun!";
    boost::regex expr("(\\w+)\\s(libraries)"); // จับคู่ "Boost libraries"
    std::string fmt("GNU \\1"); // แทนที่ด้วย "GNU Boost"

    std::string result = boost::regex_replace(s, expr, fmt);
    std::cout << result << std::endl;

    return 0;
}

ผลลัพธ์ตัวอย่าง

GNU Boost สนุก!

ตัวอย่างเหล่านี้เป็นการนำเสนอความสามารถของ C++ ในการใช้นิพจน์ปรกติเพียงผิวเผิน โดยแสดงการค้นหาพื้นฐาน, การจับคู่รูปแบบ และการแทนที่ ไม่ว่าจะใช้ไลบรารีมาตรฐานหรือได้รับการเสริมความสามารถด้วยไลบรารี regex อันทรงพลังของ Boost.