[C#] Wyrażenia regularne

0

Witam, dopiero co zaczynam naukę C# i już mam problem :/
Mianowicie mam string : "Tekst 0$</td>Tekst $0$1$</td>"

W php, żeby wyciągnąć wszystko z pomiędzy a </td> użyłbym :

 preg_match_all('#<td>(.*)</td>#',$string,$wynik);

Po przeczytaniu paru informacji nt. wyrażeń regularnych w C# doszedłem do :

 private void button3_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            string txt = "<td>Tekst 0$</td><td>Tekst $0$1$</td>";
            Regex reg = new Regex("<td>(.*)</td>");
            foreach (string s in Regex.Split(txt, "<td>(.*)</td>"))
            {
              sb.Append(s + "\n");
            }
 
            richTextBox1.Text = sb.ToString();
        }

Czego wynikiem jest niestety :

[pusta_linia]
Tekst 0$</td><td>
Tekst $0$1$

Tak więc moje pytanie - jak zbudować wyrażenie, żeby móc wyciągnąć SAM tekst ? - tak żeby nie było tych </td> jak w drugiej linijce wyniku :/

0
string txt = "<td>Tekst 0$</td><td>Tekst $0$1$</td>";
txt = Regex.Replace(txt, @"<(.|\n)*?>", string.Empty);

Chyba o to chodzi : )

0

Dzięki wielkie za odpowiedź. Ale... jak można utrudniać tak prostą rzecz :( yh... A dlaczego nie działa proste i logiczne (.*) ? :D

btw. mam funkcję static, i chcę z niej wrzucić tekst do richTextBox który jest na formie. RichTextBox ma ustawiony dostęp na public.
Tak więc jak wrzucić tekst do RichTextBox bo moje próby Form1.rich.Text = "tekst " spełzają na niczym -> czytaj błędzie.

1

Opepatory Regex są zachłanne, i zawsze zabierają tyle ile się da :) Jest jakiś sposób na wymuszenie niezachłanności, ale go nie pamiętam. I dodam jeszcze że właśnie dlatego nie powinno się przesadzać z "." . ;)

Edit: a jeśli chodzi o pytanie - bezpośrednio się nie da. Spróbuj może wartości zwracanych?

0
MSM napisał(a)

Opepatory Regex są zachłanne, i zawsze zabierają tyle ile się da :) Jest jakiś sposób na wymuszenie niezachłanności, ale go nie pamiętam. I dodam jeszcze że właśnie dlatego nie powinno się przesadzać z "." . ;)

znak zapytania u'nie'zachalannia operator, mozna to rozumiec jako 'proste dopuszczenie mozliwosci ze jednak moze go nie byc', co oczywiscie nie bedzie prawda np dla +? ktore i tak bedzie wymagalo jednego wystapienia, np:
/((ba*?)+)(baba)+/ =~ "baaabaaabaababababa" -> \1 = 'baaabaaabaa' \3 ='babababa'

http://www.amk.ca/python/howto/regex/regex.html#SECTION000730000000000000000
http://www.dijksterhuis.org/csharp-regular-expression-operator-cheat-sheet/ punkt ''Quantifiers"

0

MSM, jednak się da. Bynajmniej działa. Usunąłem "static" i... śmiga o_O.

 public Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb,
Object extraData)
        {
            Memo.Text = System.Text.Encoding.UTF8.GetString(buf);
            return size * nmemb;
        }

Memo - richTextBox (Memo - to przyzwyczajenie z Delphi :P). No i oczywiście w/w kod działa.

Co do Regex, widzę że trochę ciężko będzie mi się przyzwyczaić do nowego stylu :D Zawsze wyciągałem sobie dane przez (.*) - no chyba, że było to coś bardziej skomplikowanego - ale zawsze sobie radziłem. A tu taka komplikacja ... :(

0

jesli .? Ci nie lezy, mozesz pojsc po rozum do glowy i zamiast . napisac cos w stylu [^<]*.. w koncu w prawidlowym HTML wszystkie < oznaczaja nowy tag, zas jesli znak taki mialby sie pojawic jako tekst a nie tag, to powinien byc zapisany jako encja <

//edit: do chlopakow od wywalonych postow: skoczcie na Flame albo priv, bo tak to sie zapowiadalo.. static niestatic, kompromitacja czy nie, ale po co to ciagnac w watku ktorego autorowi juz odpowiedziano wylewnie?

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