Regexp, замена двух одинаковых символов одним

116
05 марта 2021, 05:40

Задание: избавление от буквы 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;
}
Answer 1

Чтобы заменить повторяющиеся буквы одной, нужно

Найти:      ([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" //"+" подстановка для двух одинаковых букв.
    };
}
READ ALSO
Ошибка: duplicate symbol &hellip; in: ./Debug/tinyxml2.cpp.o в Codelite [закрыт]

Ошибка: duplicate symbol … in: ./Debug/tinyxml2.cpp.o в Codelite [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

96
Не работает mouseEvent&#39;ы в QQuickItem

Не работает mouseEvent'ы в QQuickItem

У меня есть кастомный QQuickWindow (CWindow), в котором реализованы все mouseEvent'ыТак же есть кастомный QQuickItem (CItem) в котором также есть mouseEvent'ы

89
Как добавить условия try catch для цикла do while?

Как добавить условия try catch для цикла do while?

Хочу выполнять цикл бесконечно если есть ошибка catch, если ошибки нету пусть цикл будет завершен

166
Regexp. Передача регистра заменяемой буквы

Regexp. Передача регистра заменяемой буквы

Имеется слово, допустим, Cinderella, где Ci - превратится в Si, если введенное слово - cinderella, то ci превратится в si

108