#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 ?\\b(?:[Aa]n?|[Tt]he)\\b(?: ?\\W)?", "(?:\\W ?)?\\b(?:[Aa]n?|[Tt]he)\\b ?\\W", "^(?:[Aa]n?|[Tt]he)\\b\\W*|\\W*\\b(?:[Aa]n?|[Tt]he)\\W*$",
"[Cc]i", "[Cc]e", "[Cc]k?"
"[Ee]{2}", "[Oo]{2}", "([a-zA-Z])\\1" // замена любых одинаковых букв
};
Rules->replacement = { " ", " ", "",
"s", "s", "k",
"i", "u", "$1" //"+" подстановка для двух одинаковых букв.
};
}
void output(string words) {
cout << words << endl;
}
int main()
{
Lexer* Rules = new Lexer();
string words = " The text; an interesting article. A neck in the book.";
::init(Rules);
words = ::Parser(words, Rules);
output(words);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8cmVnZXg+CiNpbmNsdWRlIDx2ZWN0b3I+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IExleGVyIHsKICAgIHZlY3RvcjxzdHJpbmc+IHJ1bGU7CiAgICB2ZWN0b3I8c3RyaW5nPiByZXBsYWNlbWVudDsKfTsKCnN0cmluZyBQYXJzZXIoc3RyaW5nIHdvcmRzLCBMZXhlciogUnVsZXMpIHsKCiAgICAvL3Vuc2lnbmVkIGxvbmcgbGVuZ3RoID0gUnVsZXMtPnJ1bGUuc2l6ZSgpOwogICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IFJ1bGVzLT5ydWxlLnNpemUoKTsgaSsrKSB7CiAgICAgICAgcmVnZXggcnVsZShSdWxlcy0+cnVsZVtpXSk7CiAgICAgICAgd29yZHMgPSByZWdleF9yZXBsYWNlKHdvcmRzLCBydWxlLCBSdWxlcy0+cmVwbGFjZW1lbnRbaV0pOwogICAgfQoKICAgIHJldHVybiB3b3JkczsKfQoKdm9pZCBpbml0KExleGVyKiBSdWxlcykgewogICAgUnVsZXMtPnJ1bGUgPSB7ICJcXFcgP1xcYig/OltBYV1uP3xbVHRdaGUpXFxiKD86ID9cXFcpPyIsICIoPzpcXFcgPyk/XFxiKD86W0FhXW4/fFtUdF1oZSlcXGIgP1xcVyIsICJeKD86W0FhXW4/fFtUdF1oZSlcXGJcXFcqfFxcVypcXGIoPzpbQWFdbj98W1R0XWhlKVxcVyokIiwKICAgICAgICAgICAgICAgICAgICAiW0NjXWkiLCAiW0NjXWUiLCAiW0NjXWs/IgogICAgICAgICAgICAgICAgICAgICJbRWVdezJ9IiwgIltPb117Mn0iLCAiKFthLXpBLVpdKVxcMSIgLy8g0LfQsNC80LXQvdCwINC70Y7QsdGL0YUg0L7QtNC40L3QsNC60L7QstGL0YUg0LHRg9C60LIKICAgIH07CiAgICBSdWxlcy0+cmVwbGFjZW1lbnQgPSB7ICIgIiwgIiAiLCAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInMiLCAicyIsICJrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImkiLCAidSIsICIkMSIgLy8iKyIg0L/QvtC00YHRgtCw0L3QvtCy0LrQsCDQtNC70Y8g0LTQstGD0YUg0L7QtNC40L3QsNC60L7QstGL0YUg0LHRg9C60LIuCiAgICB9Owp9Cgp2b2lkIG91dHB1dChzdHJpbmcgd29yZHMpIHsKICAgIGNvdXQgPDwgd29yZHMgPDwgZW5kbDsKfQoKaW50IG1haW4oKQp7CiAgICBMZXhlciogUnVsZXMgPSBuZXcgTGV4ZXIoKTsKCiAgICBzdHJpbmcgd29yZHMgPSAiIFRoZSB0ZXh0OyBhbiBpbnRlcmVzdGluZyBhcnRpY2xlLiBBIG5lY2sgaW4gdGhlIGJvb2suIjsKCiAgICA6OmluaXQoUnVsZXMpOwogICAgd29yZHMgPSA6OlBhcnNlcih3b3JkcywgUnVsZXMpOwogICAgb3V0cHV0KHdvcmRzKTsKCiAgICByZXR1cm4gMDsKfQ==