Задание: избавление от буквы c, которая в сочетаниях сi и сe будет изменяться на s, в сочетании ck — опускаться, а в остальных случаях заменяться на k,изьятие всех удвоенных букв: ee изменят на i, oo - на u, a в остальных комбинациях будут просто писать одну букву вместо двух одинаковых, а так же отмена артиклей.
Вопрос: не могу разобраться, как заменить 2 одинаковые буквы одной и как передать букву в Replacement.
Заранее благодарю за ответ.
#include <iostream>
#include <string>
#include <regex>
#include <vector>
using namespace std;
struct Lexer {
vector<string> rule;
vector<string> replacement;
};
string Parser(string words, Lexer* Rules) {
//unsigned long length = Rules->rule.size();
for (unsigned i = 0; i < Rules->rule.size(); i++) {
regex rule(Rules->rule[i]);
words = regex_replace(words, rule, Rules->replacement[i]);
}
return words;
}
void init(Lexer* Rules) {
Rules->rule = { "(\\W[A-a]\\W)", "\\W[A-a] \\W", "\\W [A-a]\\W", "^([A-a])", "(\\W[A-a])+$",
"(\\W[A-a]n\\W)", "\\W[A-a]n \\W", "\\W [A-a]n\\W", "^([A-a]n)", "(\\W[A-a]n)+$",
"(\\W[T-t]he\\W)", "\\W[T-t]he \\W", "\\W [T-t]he\\W", "^([T-t]he)", "(\\W[T-t]he)+$",
"(C|c)i", "(C|c)e", "(C|c)k", "(C|c)",
"(E|e){2}", "(O|o){2}", "([a-zA-Z]{2,2})*\1" // замена любых одинаковых букв
};
Rules->replacement = { "", " ", " ", "", "", // [5] ( [A-a])+$
"", " ", " ", "", "",
"", " ", " ", "", "",
"s", "s", "", "k",
"i", "u", "+" //"+" подстановка для двух одинаковых букв.
};
}
void output(string words) {
cout << words << endl;
}
int main()
{
Lexer* Rules = new Lexer();
string words;
getline(cin, words);
::init(Rules);
words = ::Parser(words, Rules);
output(words);
return 0;
}
Чтобы заменить повторяющиеся буквы одной, нужно
Найти: ([a-zA-Z])\1
Заменить:$1
Подробности:
([a-zA-Z])
- Захватывающая подмаска №1: латинская буква\1
- обратная ссылка, в которой "хранится" значение, захваченное первой подмаской.В шаблоне замены используется та же обратная ссылка на значение первой подмаски.
Кроме того, [A-a]
находит не только A
и a
. Замените [A-a]
на [Aa]
и (C|c)
на [Cc]
.
Используйте
void init(Lexer* Rules) {
Rules->rule = { "(\\W[Aa]\\W)", "\\W[Aa] \\W", "\\W [Aa]\\W", "^([Aa])", "(\\W[Aa])+$",
"(\\W[Aa]n\\W)", "\\W[Aa]n \\W", "\\W [Aa]n\\W", "^([Aa]n)", "(\\W[Aa]n)+$",
"(\\W[Tt]he\\W)", "\\W[Tt]he \\W", "\\W [Tt]he\\W", "^([Tt]he)", "(\\W[Tt]he)+$",
"[Cc]i", "[Cc]e", "[Cc]k", "[Cc]",
"[Ee]{2}", "[Oo]{2}", "([a-zA-Z])\\1" // замена любых одинаковых букв
};
Rules->replacement = { "", " ", " ", "", "", // [5] ( [A-a])+$
"", " ", " ", "", "",
"", " ", " ", "", "",
"s", "s", "", "k",
"i", "u", "$1" //"+" подстановка для двух одинаковых букв.
};
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
У меня есть кастомный QQuickWindow (CWindow), в котором реализованы все mouseEvent'ыТак же есть кастомный QQuickItem (CItem) в котором также есть mouseEvent'ы
Хочу выполнять цикл бесконечно если есть ошибка catch, если ошибки нету пусть цикл будет завершен
Имеется слово, допустим, Cinderella, где Ci - превратится в Si, если введенное слово - cinderella, то ci превратится в si