Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <sstream>
- #include <regex>
- #include <set>
- using namespace std;
- enum TCharType {ctUnknown, ctLetters, ctDoubleDot, ctSlash, ctGrOK};
- const int TStateCount = 8;
- const int TCharTypeCount = 5;
- int transitions[TStateCount][TCharTypeCount] = {
- { 0, 0, 0, 0, 0 },
- { 0, 2, 0, 0, 0 },
- { 0, 0, 3, 0, 0 },
- { 0, 0, 0, 4, 0 },
- { 0, 0, 0, 0, 5 },
- { 0, 0, 0, 6, 5 },
- { 0, 0, 0, 0, 7 },
- { 0, 0, 0, 6, 7 }
- };
- bool isFinalState[TStateCount] = { false, false, false, false, true, false, true };
- TCharType getCharType(char c)
- {
- if ((c >= 'A') && (c <= 'Z'))
- {
- return ctLetters;
- }
- else
- {
- if (c == ':')
- return ctDoubleDot;
- if (c == '\\')
- return ctSlash;
- if ((c == '*') || (c == '|') || (c == '\\') || (c == ':') || (c == '"') || (c == '<') || (c == '>') || (c == '?') || (c == '/'))
- return ctUnknown;
- else
- return ctGrOK;
- }
- }
- bool checkString(string s)
- {
- int state = 1;
- for(int i = 0; i < s.length(); i++)
- state = transitions[state][getCharType(s[i])];
- return isFinalState[state];
- }
- string readString()
- {
- string str;
- cout << "Введите строку" << endl;
- cin.clear();
- getline(cin, str);
- return str;
- }
- void isStringCorrect(string& str, regex& pattern)
- {
- if (regex_match(str.c_str(), pattern))
- cout << "Строка соответствует шаблону." << endl;
- else
- cout << "Строка не соответствует шаблону." << endl;
- }
- int readChoise()
- {
- int order;
- bool IsNotCorrect;
- string inputLine;
- do
- {
- puts("Выберите один из вариантов: ");
- IsNotCorrect = false;
- getline(cin, inputLine);
- try
- {
- order = stoi(inputLine);
- }
- catch (...)
- {
- IsNotCorrect = true;
- puts("Введите число!");
- }
- if (!IsNotCorrect && (((order < 1) || (order > 4))))
- {
- puts("Введите число от 1 до 4!");
- IsNotCorrect = true;
- }
- } while (IsNotCorrect);
- return order;
- }
- void findMathes(string str, regex& pattern)
- {
- set <string> st;
- for (size_t i = 0; i < str.length(); i++)
- {
- smatch match;
- str = str.substr(i);
- if (regex_search(str, match, pattern))
- for (size_t i = 0; i < match.length(); i++)
- if ((match[i] != ""))
- //cout << match[i] << endl;
- st.insert(match[i]);
- }
- for (set<string>::const_iterator it = st.begin(); it != st.end(); ++it)
- {
- cout << *it << endl;
- }
- }
- void showMenu()
- {
- string str = readString();
- do {
- cout << "Ваша строка:" << str << endl;
- puts("Выберите один из пунктов меню для продолжения:");
- puts("1. Проверка корректности произвольной строки.");
- puts("2. Поиск всех подстрок, соответствующих требованиям, в произвольной строке.");
- puts("3. Ввести новую строку.");
- puts("4. Выход.");
- switch (readChoise())
- {
- case 1:
- {
- regex pattern(R"(^[a-zA-Z]:\\([^\*\|\\:\"<>\?\/]+\\)*([^\*\|\\:\"<>\?\/]+)$)");
- isStringCorrect(str, pattern);
- break;
- }
- case 2:
- {
- regex pattern(R"([a-zA-Z]:\\(?:[^\*\|\\:\"<>\?\/\s]+\\)*[^\*\|\\:\"<>\?\/\s]+)");
- findMathes(str, pattern);
- break;
- }
- case 3:
- {
- str = readString();
- break;
- }
- case 4:
- return;
- }
- } while (true);
- }
- int main()
- {
- setlocale(LC_ALL, "ru");
- showMenu();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement