Фильтрация строк с использованием регулярных выражений в формате utf8 - PullRequest
9 голосов
/ 21 мая 2019

Я пытаюсь отфильтровать строки, которые экранируют специальные символы и преобразуют их в строчные. Например: "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;
}

1 Ответ

6 голосов
/ 21 мая 2019

Вы можете сопоставить любой символ буквы "Юникод", используя регулярное выражение \p{L}\p{M}*.

Следовательно, полное регулярное выражение будет:

((?:\p{L}\p{M}*)+(?:['_-](?:\p{L}\p{M}*)+)*)

Демо

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...