使用utf8格式的正则表达式过滤字符串

dqm*_*mis 9 c++ regex unicode utf-8 c++14

我正在尝试过滤转义特殊字符的字符串并将其转换为小写。例如:"Good morning!"转换为good morning
我当时将一个字符串传递给我的函数。
我已成功过滤了英语字符串,但传递本地语言字符串时出现问题。
如果要包含所有utf-8字符,应该使用哪种类型的正则表达式过滤器字符串?

#include <string>
#include <iostream>
#include <regex>
#include <algorithm>

std::string process(std::string s) {
    std::string st;
    std::regex r(R"([^\W_]+(?:['_-][^\W_]+)*)");
    std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
    std::smatch m = *i;
    st = m.str();
    std::transform(st.begin(), st.end(), st.begin(), ::tolower);
    return st;
}

int main() {
    std::string st = "?žuolas!";
    std::cout << process(st) << std::endl; // <- gives: uolas
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Anm*_*ggi 6

您可以使用regex匹配任何unicode“字母”字符\p{L}\p{M}*

因此,完整的正则表达式将是:

((?:\p{L}\p{M}*)+(?:['_-](?:\p{L}\p{M}*)+)*)
Run Code Online (Sandbox Code Playgroud)

演示版

资源