Имеется слово, допустим, Cinderella, где Ci - превратится в Si, если введенное слово - cinderella, то ci превратится в si.
Как в правилах передать регистр заменяемой буквы?
Rules->rule = {"[Cc]i", "[Cc]e", "[Cc]k", "[Cc]"}
Rules->replacement = {"si", "se", "", "k"}
Предлагаю воспользоваться boost::regex
, это более мощная библиотека регулярных выражений, которая поддерживает условную замену.
Замените свои регулярные выражения следующими:
"(?:(C)|(c))i", "(?:(C)|(c))e", "[Cc]k", "(?:(C)|(c))",
И шаблоны замены на
"(?1Si:si)", "(?1Se:se)", "", "(?1K:k)",
К regex rule(Rules->rule[i]);
добавьте приставку boost
, а вместо words = regex_replace(words, rule, Rules->replacement[i]);
напишите words = boost::regex_replace(words, rule, Rules->replacement[i], boost::format_all);
. Именно boost::format_all
позволяет использовать конструкцию типа если-то-или в шаблонах замены.
См. пример работы программы:
#include <iostream>
#include <string>
#include <vector>
#include <boost/regex.hpp>
using namespace std;
struct Lexer {
vector<string> rule;
vector<string> replacement;
};
string Parser(string words, Lexer* Rules) {
for (unsigned i = 0; i < Rules->rule.size(); i++) {
boost::regex rule(Rules->rule[i]);
//words = regex_replace(words, rule, Rules->replacement[i]);
words = boost::regex_replace(words, rule, Rules->replacement[i], boost::format_all);
}
return words;
}
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)+$",
"(?:(C)|(c))i", "(?:(C)|(c))e", "[Cc]k", "(?:(C)|(c))",
"[Ee]{2}", "[Oo]{2}", "([a-zA-Z])\\1" // замена любых одинаковых букв
};
Rules->replacement = { "", " ", " ", "", "", // [5] ( [A-a])+$
"", " ", " ", "", "",
"", " ", " ", "", "",
"(?1Si:si)", "(?1Se:se)", "", "(?1K:k)",
"i", "u", "$1"
};
}
void output(string words) {
cout << words << endl;
}
int main()
{
Lexer* Rules = new Lexer();
string words;
words = "Cinderella cinderella beck and Coral"; //getline(cin, words);
::init(Rules);
words = ::Parser(words, Rules);
output(words);
return 0;
}
Результат: Sinderela sinderela be and Koral
.
Как это работает
Разберём один пример: (?:(C)|(c))i
=> (?1Si:si)
. Тут (?:(C)|(c))i
находит либо C
(и помещает его в подмаску №1) или c
(и помещает её в подмаску №2), а потом находит i
. Замену читаем следующим образом: (?1
- если подмаска №1 содержит какое-то значение, подставь Si
, иначе (:
) подставь si
. Конец шаблона условной замены ()
).
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Если ввести не число, то выводится строка "Введите число", а потом выбрасывается исключение в строке cin >> delaySec в блоке catch:
Есть сайт, которую перенесли с Wordpress на ModXПосле чего форма отправки заявок перестала работать
Пытаюся создать простой блог не не как не могу добовлять статьи по сути готовая версия уже есть но нужно сделать это все одним классом во viespy...
Столкнулся проблемной, что vk при отправки ссылки главной страницы http://alisa-musicru/ отображает не заданный <meta property="og:title" content="Все песни Алисы...