[C#] Wyszukiwanie słowa w tekście

0
<success> − <items> − <item> <id>6691502879332424</id> <name>Pralka LG F-1403TDS</name> <shop_count>7</shop_count> <offer_count>7</offer_count> <price_min>2492,00</price_min> <price_max>2799,00</price_max> <price_avg>2631,71</price_avg> − <ur l="l"> http://www.nokaut.pl/pralki/pralka-lg-f-1403tds.html </ur l> <rate>0.00</rate> <thumbnail>http://img.nokaut.pl/bdk/90/5/173465.jpg</thumbnail> <im age="age">http://img.nokaut.pl/bdk/130/5/173465.jpg</ image> </item> </items> </success>

Jest jakaś gotowa funkcja, która wyszukuje zadane słowo w tekście? Chodzi mi o to, że mając taki tekst jak wyżej, chciałbym np. "wyciągnąć" linijkę, która jest między znacznikami <image>.
Napisałem własną funkcję, ale gdyby była jakaś gotowa to z pewnością aplikacja działałaby szybciej...

1

Od tego jest mechanizm wyrażeń regularnych. Zainteresuj się klasą Regex.

0

Kombinuję z tym regex'em, ale mi nie wychodzi;/
Mam taki kod:

 string input;
            string pattern = @"<thumbnail>";
            while (b!=0)
            {
                input = textBox2.Text;
                Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
                MatchCollection matches = rgx.Matches(input);
                if (matches.Count > 0)
                {
                    MessageBox.Show(input.ToString(), matches.Count.ToString());
                    foreach (Match match in matches)
                        MessageBox.Show("   " + match.Value);
                }
                b--;
            }

Próbuję zliczyć wystąpienia znacznika <thumbnails>, jednak zmienna matches cały czas jest pusta. Wie ktoś gdzie leży problem?

@Edit: W textBox'ie jest tekst z postu pierwszego.

0

Poradziłem sobie z tym, w ten sposób

            string input;
            string pattern = @"<thumbnail>";
            Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
            input = textBox2.Text;
            MatchCollection matches = rgx.Matches(input);
            int p = 0;
            foreach (Match match in matches)
            {
                MessageBox.Show(p.ToString()+"   " + match.Value);
                p++;
            }

Jednak teraz pytanie, czy da się jakoś odczytać gdzie znajdują się wyszukane słowa? Odczytać ich pozycję w tekście?

1
rexio1988 napisał(a)

Jednak teraz pytanie, czy da się jakoś odczytać gdzie znajdują się wyszukane słowa? Odczytać ich pozycję w tekście?

Da się, ale raczej nie regexami.

Zadaj może jedno konkretne pytanie i napisz o co Ci chodzi, bo tak to do niczego możemy nie dojść.

0

Ok to już zrobiłem. Napisałem funkcję przeszukująca tekst po znakach i wartość przypisałem do tablicy. Może trochę wolne rozwiązanie, ale działa póki co. Później ewentualnie poprawie na coś szybszego. A jeszcze takie pytanko mam. Jak czyścić Panel na którym są tworzone dynamicznie pictureBox'y i label'e? Panel wypełnia się nimi po naciśnięciu button'a i myślę, że jako pierwsza czynność można by umieścić właśnie czyszczenie Panelu, żeby wcześniejsze wartości wymazać.

1

W sensie usunąć te PictureBoxy i Labele?

nazwaPanela.Controls.Clear()
0

Wracając do regex'a, to jak sformułować wyrażenie regularne takie, żeby wydobyć z tekstu np. takie zdanie, które jest między dwoma znacznikami? Nawet z nimi, bo przecież później można stringa obciąć. Da się je jakoś tak skonstruować, żeby szukany string zaczynał się np. od <image> i kończył na </image>? Tych wyrażeń nie ogarniam za bardzo, więc wdzięczny byłbym, gdyby ktoś napisał to wyrażenie.

1

Hmm...
W zasadzie, to chyba lepiej byłoby potraktować ten Twój tekst jako XML (bo to chyba jest XML, prawda?) i operować na nim w ten sposób. Zainteresuj się klasą XDocument i LINQ to XML. Wtedy odpadnie Ci zabawa z Regexami.

0

Tak, to jest XML. Ale pobieram go do programu i dalej traktuje już jako string. Potrzebne mi tylko wyciągnięcie tego co pomiędzy tymi znacznikami, więc nie widzę sensu korzystania z Linq'a. Bo z tego nie tworzę już żadnych nowych dokumentów XML. Po prostu chcę do tablicy wpisać te wartości.

1

Z tego co piszesz najprościej Ci będzie skorzystac, jak to juz napisal somekind, z XmlDocument

Przykładowy kod odczytujący wartośc z konkretnego taga

XmlDocument xml = new XmlDocument();
xml.load("plik_do_odczytu.xml");
string s = xml.SelectedSingleNode("success/items/item/name").InnerText;
 

i juz w stringu masz "Pralka LG F-1403TDS" :)

1
gekon napisał(a)

Z tego co piszesz najprościej Ci będzie skorzystac, jak to juz napisal somekind, z XmlDocument

Ja pisałem o XDocument, bo wówczas się używa LINQ, a nie XPatha. Ale co kto woli oczywiście.

rexio1988 napisał(a)

Bo z tego nie tworzę już żadnych nowych dokumentów XML. Po prostu chcę do tablicy wpisać te wartości.

A co to ma do rzeczy, że nie tworzysz nowych? LINQ służy do wyciągania danych, nie tworzenia.
Ale jeśli nie widzisz sensu w ułatwianiu sobie życia, to sobie utrudniaj.
Na mnie już czas - dobranoc. :)

0

Dzięki chłopaki! Zrobiłem to z wykorzystaniem XPath'a. Skorzystałem jednak z xml.SingleNodes bo potrzebuję wyciągnąć wszystkie nazwy.

0

I znowu mam problem. Korzystam z API prównywarki nokaut.pl, które udostępnia wyszukiwanie produktu, ale nie ma już możliwości wydobycia bezpośredniego linku, który przekieruje do sklepu. Tutaj już muszę sobie poradzić z całą treścią strony. Więc pytanie czy istnieje jakaś funkcja przeszukująca tekst? Bo wcześniej napisałem funkcję, która przeszukuje tekst po znakach (string'a z tekstem całej strony zamieniłem na tablicę char'ów), ale jest to rozwiązanie trochę wolne, dlatego pytam czy jest jakiś szybszy sposób.

0

Bo tego już z wykorzystaniem Xpath'a tego nie zrobię, bo nie można tej treści wczytać jako XML ;/ Jakieś pomysły?

1

Np. metoda string.IndexOf - w zależności od przeciążenia możesz podać albo tekst do wyszukiwania albo np. tekst i indeks początku wyszukiwania.

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