C++:
การลบตัวอักษรที่ตรงกับรูปแบบ
วิธีการ:
มาดึงอักขระออกโดยใช้ erase
และ remove_if
ควบคู่ไปกับนิพจน์ lambda นี่คือตัวอย่างที่เร็ว:
#include <iostream>
#include <algorithm>
#include <string>
int main() {
std::string data = "B4n4n4!";
// ลบอักขระตัวเลขทั้งหมด
data.erase(std::remove_if(data.begin(), data.end(), ::isdigit), data.end());
std::cout << data << std::endl; // แสดงผล: Bnn!
return 0;
}
ตัวอย่างผลลัพธ์:
Bnn!
การทำความลึก
อัลกอริทึม std::remove_if
จากหัวข้อ <algorithm>
ไม่ได้จริงๆ ลดขนาดสตริง; มันจัดเรียงองค์ประกอบใหม่และส่งกลับตัวชี้ไปยังตอนท้ายตามหลักเกณฑ์ใหม่ วิธีการ erase
ของคลาส std::string
จะลบส่วนที่ไม่จำเป็นออกจากตอนท้าย ชุดคำสั่งนี้มาพร้อมกับ C++98 และยังคงเป็นที่นิยมและมีประสิทธิภาพ
ทางเลือกอื่น? สำหรับแบบแผนที่ซับซ้อน, regex (<regex>
) เป็นเครื่องมือหลายประโยชน์ แต่มันเหมือนกับใช้ปืนใหญ่ยิงนกสำหรับงานเล็กๆ
รายละเอียดเพิ่มเติม? std::remove_if
และอัลกอริทึมที่คล้ายกันมีพื้นฐานมาจากไอเทอเรเตอร์, ซึ่ง C++ ได้รับมาจาก Standard Template Library (STL) ในช่วงกลางยุค 90s พวกมันสนับสนุนการเขียนโปรแกรมแบบเจเนอริก, รับรองว่าโค้ดการตัดและเปลี่ยนของคุณทำงานได้กับสตริง, ลิสต์, อะไรต่อมิอะไรก็ตาม
ดูเพิ่มเติม
- อ้างอิง C++ สำหรับ
std::remove_if
: https://en.cppreference.com/w/cpp/algorithm/remove - อ้างอิง C++ สำหรับ
std::string::erase
: https://en.cppreference.com/w/cpp/string/basic_string/erase - เพิ่มเติมเกี่ยวกับไอเทอเรเตอร์ใน C++: https://en.cppreference.com/w/cpp/iterator
- เมื่อไรควรใช้
std::regex
สำหรับการจับคู่แบบแผน: https://en.cppreference.com/w/cpp/regex