Wyszukiwanie ciągu znaków w innym ciągu z tzw. '*' - zastępującą dowolny znak w dowolnej ilości

0

Witam,

Mam zadanie dotyczące przeszukania jednego ciągu pod kątem występowania w nim innego, ale z wykorzystaniem tzw * (tak jak szukamy pliku) gwiazdka ta ma symbolizować dowolna ilość i dowolny znak w ciągu szukanym w przeszukiwanym. Samo przeszukiwanie za pomocą metody basestring.Contains(otherString) mnie jest problemem, natomiast zastanawia mnie czy istnieje jakiś mechanizm dotyczący (stworzony na podobieństwo) mechanizmu wyszukiwania z użyciem znaku specjalnego '*'????

czy mam to sam zaimplementować, a jeżeli tak to czy ktoś ma może jakieś sprawdzone przykłady.

0

Można w tym celu użyć np. prostego wyrażenia regularnego.

0
            string text = "WebService,ABC,BABA,MyService,asdf,YourService";
            string pattern = "[A-Z][a-z]*Service";

            MatchCollection matches = Regex.Matches(text, pattern);

            foreach (var match in matches)
            {
                Console.WriteLine(match);
            }

Result:

WebService
MyService
YourService

Do testowania wyrażeń regularnych polecam stronę: http://regexhero.net/tester/

0

Takie coś spełnia te wymagania? Jako, że '' miała reprezentować dowolny znak, oraz dowolną ich ilość. Wklepując "Sk" jako rezultat wyskoczy cały ciąg.

 
        static void Main(string[] args)
        {
            string testString = "Sierotka marysia bardzo lubila zapalki, tak";

            while (true)
            {
                string patternString = Console.ReadLine();
                patternString = patternString.Replace("*", @"(\W|\w)+");

                Regex regex = new Regex(patternString);
                MatchCollection matchCollection = regex.Matches(testString);

                foreach (Match match in matchCollection)
                {
                    Console.WriteLine("Znaleziono {0} na pozycji: {1}", match.Value, match.Index);
                }
            }
        }
0
ulong88 napisał(a):

Takie coś spełnia te wymagania? Jako, że '' miała reprezentować dowolny znak, oraz dowolną ich ilość. Wklepując "Sk" jako rezultat wyskoczy cały ciąg.

 
        static void Main(string[] args)
        {
            string testString = "Sierotka marysia bardzo lubila zapalki, tak";

            while (true)
            {
                string patternString = Console.ReadLine();
                patternString = patternString.Replace("*", @"(\W|\w)+");

                Regex regex = new Regex(patternString);
                MatchCollection matchCollection = regex.Matches(testString);

                foreach (Match match in matchCollection)
                {
                    Console.WriteLine("Znaleziono {0} na pozycji: {1}", match.Value, match.Index);
                }
            }
        }

Cały ciąg zmatchuje się po użyciu patternu "S.*k". Kropka oznacza dowolny znak, natomiast gwiazdka oznacza dowolną liczbę powtórzeń znaku, lub grupy przed gwiazdką. Słusznie jednak zauważyłeś, że matchowanie w ten sposób nie jest rozwiązaniem problemu. Pattern musi być bardziej restrykcyjny aby miał sens.

0

Gwiazdka oznacza dowolną ilość powtórzeń, w tym zerową. Lepsze będzie .+, czyli jeden lub więcej dowolnych znaków (inaczej .{1,}).

0

Pamiętam że potrzebowałem kiedyś czegoś podobnego
użyłem : http://www.codeproject.com/Articles/11556/Converting-Wildcards-to-Regexes
działa do dziś :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1