c++ — Làm cách nào để loại bỏ tất cả các ký tự không chữ và số từ một chuỗi trong c ++?

Viết hàm lấy char và trả về true nếu bạn muốn xóa ký tự đó hoặc false nếu bạn muốn giữ nó:

bool my_predicate(char c);

Sau đó, sử dụng thuật toán std::remove_if để xóa các ký tự không mong muốn khỏi chuỗi:

std::string s = "my data";
s.erase(std::remove_if(s.begin(), s.end(), my_predicate), s.end());

Tùy thuộc vào yêu cầu của bạn, bạn có thể sử dụng một trong các vị từ Thư viện chuẩn, như std::isalnum, thay vì viết vị ngữ của riêng bạn (bạn nói rằng bạn cần khớp các ký tự chữ và số, vì vậy có lẽ điều này không phù hợp với những gì bạn cần ).

Nếu bạn muốn sử dụng chức năng Thư viện tiêu chuẩn std::isalnum, bạn sẽ cần một nhóm truyền để phân tán giữa chức năng std::isalnum trong tiêu đề Thư viện chuẩn C <cctype> (là tiêu đề bạn muốn sử dụng) và std::isalnum trong tiêu đề Thư viện chuẩn C++ <locale> đó không phải là cái bạn muốn sử dụng, trừ khi bạn muốn thực hiện xử lý chuỗi cụ thể theo miền địa phương):

s.erase(std::remove_if(s.begin(), s.end(), (int(*)(int))std::isalnum), s.end());

Điều này hoạt động tốt như nhau với bất kỳ vùng chứa trình tự nào (bao gồm std::string, std::vectorstd::deque). Thành ngữ này thường được gọi là thành ngữ “xóa/xóa”. Thuật toán std::remove_if cũng sẽ hoạt động với các mảng thông thường. std::remove_if chỉ thực hiện một lần duy nhất trong chuỗi, do đó, nó có độ phức tạp thời gian tuyến tính.