MaksNew

Untitled

Dec 2nd, 2021
636
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <sstream>
  3. #include <regex>
  4. #include <set>
  5. using namespace std;
  6.  
  7. enum TCharType {ctUnknown, ctLetters, ctDoubleDot, ctSlash, ctGrOK};
  8.  
  9. const int TStateCount = 8;
  10. const int TCharTypeCount = 5;
  11.  
  12. int transitions[TStateCount][TCharTypeCount] = {
  13.     { 0, 0, 0, 0, 0 },
  14.     { 0, 2, 0, 0, 0 },
  15.     { 0, 0, 3, 0, 0 },
  16.     { 0, 0, 0, 4, 0 },
  17.     { 0, 0, 0, 0, 5 },
  18.     { 0, 0, 0, 6, 5 },
  19.     { 0, 0, 0, 0, 7 },
  20.     { 0, 0, 0, 6, 7 }
  21. };
  22.  
  23. bool isFinalState[TStateCount] = { false, false, false, false, true, false, true };
  24.  
  25. TCharType getCharType(char c)
  26. {
  27.     if ((c >= 'A') && (c <= 'Z'))
  28.     {
  29.         return ctLetters;
  30.     }
  31.     else
  32.     {
  33.         if (c == ':')
  34.             return ctDoubleDot;
  35.         if (c == '\\')
  36.             return ctSlash;
  37.         if ((c == '*') || (c == '|') || (c == '\\') || (c == ':') || (c == '"') || (c == '<') || (c == '>') || (c == '?') || (c == '/'))
  38.             return ctUnknown;
  39.         else
  40.             return ctGrOK;
  41.     }
  42. }
  43.  
  44. bool checkString(string s)
  45. {
  46.     int state = 1;
  47.     for(int i = 0; i < s.length(); i++)
  48.         state = transitions[state][getCharType(s[i])];
  49.     return isFinalState[state];
  50. }
  51.  
  52.  
  53. string readString()
  54. {
  55.     string str;
  56.     cout << "Введите строку" << endl;
  57.     cin.clear();
  58.     getline(cin, str);
  59.     return str;
  60. }
  61.  
  62. void isStringCorrect(string& str, regex& pattern)
  63. {
  64.     if (regex_match(str.c_str(), pattern))
  65.         cout << "Строка соответствует шаблону." << endl;
  66.     else
  67.         cout << "Строка не соответствует шаблону." << endl;
  68. }
  69.  
  70. int readChoise()
  71. {
  72.     int order;
  73.     bool IsNotCorrect;
  74.     string inputLine;
  75.     do
  76.     {
  77.         puts("Выберите один из вариантов: ");
  78.         IsNotCorrect = false;
  79.         getline(cin, inputLine);
  80.         try
  81.         {
  82.             order = stoi(inputLine);
  83.         }
  84.         catch (...)
  85.         {
  86.             IsNotCorrect = true;
  87.             puts("Введите число!");
  88.         }
  89.         if (!IsNotCorrect && (((order < 1) || (order > 4))))
  90.         {
  91.             puts("Введите число от 1 до 4!");
  92.             IsNotCorrect = true;
  93.         }
  94.     } while (IsNotCorrect);
  95.     return order;
  96. }
  97.  
  98. void findMathes(string str, regex& pattern)
  99. {
  100.     set <string> st;
  101.     for (size_t i = 0; i < str.length(); i++)
  102.     {
  103.         smatch match;
  104.         str = str.substr(i);
  105.         if (regex_search(str, match, pattern))
  106.             for (size_t i = 0; i < match.length(); i++)
  107.                 if ((match[i] != ""))
  108.                     //cout << match[i] << endl;
  109.                     st.insert(match[i]);
  110.     }
  111.     for (set<string>::const_iterator it = st.begin(); it != st.end(); ++it)
  112.     {
  113.         cout << *it << endl;
  114.     }
  115. }
  116.  
  117. void showMenu()
  118. {
  119.     string str = readString();
  120.     do {
  121.         cout << "Ваша строка:" << str << endl;
  122.         puts("Выберите один из пунктов меню для продолжения:");
  123.         puts("1. Проверка корректности произвольной строки.");
  124.         puts("2. Поиск всех подстрок, соответствующих требованиям, в произвольной строке.");
  125.         puts("3. Ввести новую строку.");
  126.         puts("4. Выход.");
  127.         switch (readChoise())
  128.         {
  129.         case 1:
  130.         {
  131.             regex pattern(R"(^[a-zA-Z]:\\([^\*\|\\:\"<>\?\/]+\\)*([^\*\|\\:\"<>\?\/]+)$)");
  132.             isStringCorrect(str, pattern);
  133.             break;
  134.         }
  135.         case 2:
  136.         {
  137.             regex pattern(R"([a-zA-Z]:\\(?:[^\*\|\\:\"<>\?\/\s]+\\)*[^\*\|\\:\"<>\?\/\s]+)");
  138.             findMathes(str, pattern);
  139.             break;
  140.         }
  141.         case 3:
  142.         {
  143.             str = readString();
  144.             break;
  145.         }
  146.         case 4:
  147.             return;
  148.         }
  149.     } while (true);
  150. }
  151.  
  152. int main()
  153. {
  154.     setlocale(LC_ALL, "ru");
  155.     showMenu();
  156. }
RAW Paste Data