Advertisement
MartisK

Vowel regex

Nov 25th, 2020
615
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.81 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text.RegularExpressions;
  4.  
  5. /*
  6.  
  7.     13.30 update:   dabar reikia sutvarkyti regexo patterna, kad matchintu tai, ko mums reikia
  8.                     ([A-Z])\w+ - sis patternas reiskia, kad iesko zodziu is didziuju raidziu, btw
  9.                     ([a-z])\w+ - jei butu taip, ieskotu zodziu, kurie prasideda is mazosios raides
  10.  
  11. */
  12.  
  13. namespace Program
  14. {
  15.     public class Program
  16.     {
  17.         // Apsirasom visas balses, kad galetume checkinti regexe
  18.         private static string vowelLetters = "aąeęėiįyouųū";
  19.         // apsirasom visus galimus skyriklius, nes uzduoty pasakyta, kad skyrikliu aibe zinoma
  20.         // cia yra ne char, o Char del to, kad to reikalauja Split() funkcija, watch this
  21.         private static Char[] separators = new Char[] { ' ', ',', '.', '!', '?', '(', ')', ':', ';', '\t', '\n' };
  22.         // duomenu failo pavadinimas
  23.         private static string dataFile = @"./Knyga.txt";
  24.  
  25.         // susikuriam Lista su savo apsirasyta WordMatch klase, kuria saugosim rezultatus pirmai uzduociai
  26.         private static List<WordMatch> resultingVowelWords = new List<WordMatch>();
  27.  
  28.         public static void Main()
  29.         {  
  30.             // Readinam is failo, sita funkcija daro ir biski daugiau nei tik readina is failo, realiai joje ivyksta visas uzduoties
  31.             // sprendimas
  32.             ReadFromFile(dataFile);
  33.             IComparer<WordMatch> comparer = new WordMatchSorter();
  34.             resultingVowelWords.Sort(comparer);
  35.            
  36.             PrintVowelWords();
  37.         }
  38.  
  39.         public static void ReadFromFile(string file)
  40.         {
  41.             // kadangi kaip sakiau tas online emulatorius neturi IO, tai apsirasiau failo turiny masyve
  42.             string[] lines = new string[] {
  43.                 "Naktį pasnigo, miškas nubalo. Nendrės, juosiančios ežerėlį, buvo tarytum paslaptingi hieroglifai,",
  44.                 "kaligrafo ąsa įrėžti į tylą, neperskaitomi, todėl nebylūs. Tik du didžiuliai krankliai vartėsi,",
  45.                 "žaidė ore vis sugrumėdami toli girdimais balsais. Miškas stovėjo tarytum rikiuotė baltų ir",
  46.                 "juodų pėstininkų ąsa. Ežero vanduo buvo juodas ir slėpė bedugnę. Lygaus paviršiaus nežeidė",
  47.                 "net menkiausias vėjelis, tik tamsiajame veidrody atsispindėjo pakibęs (tiesiai pačiame paveikslo viduryje)",
  48.                 "plaštakos formos debesis. ežerėlį ore ore Ore įrėžti yla ola ėjo eina atsibodę įvyko atvyko"
  49.             };
  50.  
  51.             foreach(string line in lines)
  52.             {
  53.                 // pagrindinis musu metodas, kuris issprendzia pirmos uzduoties problema
  54.                 WordVowelMatchInLine(line);
  55.             }
  56.         }
  57.  
  58.         public static void WordVowelMatchInLine(string line)
  59.         {
  60.             // apsirasom Regex patterna
  61.             string pattern = String.Format(@"\b[{0}].*[{0}]\b", vowelLetters);
  62.             // sukuriam regexa jam priskirdami apsirasyta patterna
  63.             Regex regex = new Regex(pattern);
  64.  
  65.             // pasplitinam eilute i zodzius su apsirasytais skyrikliais
  66.             string[] lineWords = line.Split(separators);
  67.  
  68.             // loopinam per visus zodzius
  69.             foreach(string word in lineWords)
  70.             {
  71.                 // tikrinam ar zodis matchina regexo patterna
  72.                 if (regex.IsMatch(word.ToLower()))
  73.                 {
  74.                     // jei matchina pridedam i lista
  75.                     // cia yra mandresnis objekto sukurimas, kokio turbut nesi mates
  76.                     // taip yra del to, nes mes neturim apsirase klases konstruktoriaus, todel sukuriam fake objekta,
  77.                     // neissaugodami jo atminty
  78.                     // struktura panasi kaip ir bet kokio kito tipo kurimas ir reiksmiu priskyrimas, watch this
  79.                     AddWordToResultList(word);
  80.                 }
  81.             }
  82.         }
  83.  
  84.         public static void AddWordToResultList(string word)
  85.         {
  86.             int id = -1;
  87.             for (int i = 0; i < resultingVowelWords.Count; i++)
  88.             {
  89.                 if (String.Compare(resultingVowelWords[i].Word, word.ToLower()) == 0)
  90.                 {
  91.                     id = i;
  92.                     break;
  93.                 }
  94.             }
  95.  
  96.             if (id != -1)
  97.             {
  98.                 resultingVowelWords[id].Count += 1;
  99.             }
  100.             else
  101.             {
  102.                 resultingVowelWords.Add(new WordMatch { Word = word.ToLower(), Count = 1 });
  103.             }
  104.         }
  105.  
  106.         public static void PrintVowelWords()
  107.         {
  108.             Console.WriteLine("Žodžių kiekis, kurie prasideda ir pasibaige balse yra {0}", GetVowelWordsCount());
  109.             for(int i = 0; i < 10; i++)
  110.             {
  111.                 Console.WriteLine("Žodis {0} pasikartoja {1} kartą(-us)", resultingVowelWords[i].Word, resultingVowelWords[i].Count);
  112.             }
  113.         }
  114.  
  115.         public static int GetVowelWordsCount()
  116.         {
  117.             int result = 0;
  118.             foreach (var word in resultingVowelWords)
  119.             {
  120.                 result += word.Count;
  121.             }
  122.             return result;
  123.         }
  124.     }
  125.  
  126.     // apsirasyta klase pirmai uzduociai
  127.     public class WordMatch
  128.     {
  129.         // Uzduotis praso atspausdinti zodi pagal jo pasikartojimu kieki, todel jei liste tokio zodzio dar nera ji idedam
  130.         public string Word { get; set; }
  131.         // o jei yra, incrementinam Counta
  132.         public int Count { get; set; }
  133.     }
  134.  
  135.     public class WordMatchSorter : IComparer<WordMatch>
  136.     {  
  137.         public int Compare(WordMatch a, WordMatch b)
  138.         {
  139.             if (a.Count == b.Count)
  140.             {
  141.                 return a.Word.CompareTo(b.Word);
  142.             }
  143.             return b.Count.CompareTo(a.Count);
  144.         }
  145.     }
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement