Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Regex Email


Rekomendowane odpowiedzi

Opublikowano

Siema,

 

Próbuję zrobić pobieranie email z strony:

Na stronie jest takie coś (kilka):

 

<a target="bank" id="[email protected]"  title="[email protected]" />

<a target="bank" id="[email protected]"  title="[email protected]" />

 

itd

 

A mój kod: 

private void button2_Click(object sender, EventArgs e)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("strona");
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            StreamReader sr = new StreamReader(response.GetResponseStream());
            string sourceCode = sr.ReadToEnd();
            sr.Close();
            response.Close();

            Regex reg = new Regex("");
            Match mat = reg.Match(sourceCode);

            StreamWriter sc = new StreamWriter(@"SC.txt");
            sc.Write(mat.Value);
            sc.Close();
            

        }

Jak zrobić żeby pobierało emaile i wpisywało do SC?

linki w górę

Opublikowano

Przykładowe wyrażenie:

<a target="bank" id="user-(.+?)"  title="\1" \/>

Następnie robisz sobie taki obiekt regexa(będzie trzeba pokombinować z wpisywaniem go do kodu, bo będzie problem ze znakiem ") i lecisz taką pętelką:

foreach (Match i in expr.Matches(text))
{
// tutaj uzyskasz email pisząc i.Groups[1]
}

Ofc. musisz mieć obiekty expr(Regex) i text(String).

Opublikowano

hm, nie jestem pewien czy do końca rozumiem. 

Mógłbyś podać jakiś zarys kodu na podstawie mojego? 

 

Poza tym 

<a target="bank" id="user-(.+?)"  title="\1" \/>

Da się to wgl wpisać? Myślałem żeby wrzucić najpierw do stringa, ale coś nie chce działać.

 

A i mógłbyś mi wytłumaczyć czemu akurat:

(.+?)

\1

Tak z czystej ciekawości, żeby się czegoś nauczyć :)

 

Edit: dobra zrobiłem inaczej i niby działa, ale pobiera tylko jakieś literki.

Wydaje się że muszę wpisać całe  

<a target="bank" id="user-(.+?)"  title="\1" \/>

ale nie wiem jak

linki w górę

Opublikowano

Przyjrzałem się temu i wpisać się da za pomocą \" oraz \\. Masz tutaj przykładowe wykorzystanie.

 

Regexy działają w ten sposób, że po prostu szukają pasujących wyrażeń w tekście. Ten fragment

<a target="bank" id="user-

nie zawiera niczego specjalnego i po prostu szuka takiego ciągu znaków.

(.+?)

Teraz - nawiasy po pierwsze grupują wyrażenie, ale to co się w nich znajdzie zostaje zapisane jako zawartość tzw. capture group'a - jako że jest to pierwsza grupa, będzie można uzyskać zawartość za pomocą .Groups[1] na obiekcie Match. Kropka oznacza dowolny znak poza końcem linii, plus oznacza że ma znaleźć 1 lub więcej poprzedniego elementu(w tym przypadku kropki, tj. dowolnego znaku poza znakiem końca linii), natomiast pytajnik tutaj oznacza że to .+ ma znaleźć tak mało znaków, jak się da. Cała zawartość tego zostaje zapisana jako capture group. Zostaje już tylko kawałek

\1

Oznacza on że ma się tam znajdować ciąg znaków identyczny z zawartością capture group'a nr 1.

 

Jak chcesz się nauczyć więcej o regex'ach to przeczytaj jakiś kurs albo poeksperymentuj sam np. tutaj, na żywo możesz edytować wyrażenie, znajduje ci błędy, koloruję składnie itp..

Opublikowano

Ok, dzięki za wytłumaczenie :)

 

Zrobiłem tak:

 List<string> emaile = new List<string>();
            WebClient web = new WebClient();
            string html = web.DownloadString("strona");
            MatchCollection m1 = Regex.Matches(html, "<a target=\"bank\" id=\"user-(.+?)\"  title=\"\\1\" \\/>", RegexOptions.Singleline);

            foreach (Match m in m1)
            {
                string email = m.Groups[1].Value;
                emaile.Add(email);
            }
            listBox1.DataSource = emaile;

Wzorując się na filmiku z yt. Niestety nie działa. (nic się nie dzieje) 

 

Jeszcze wcześniej miałem tak:

List<string> emaile = new List<string>();
            WebClient web = new WebClient();
            string html = web.DownloadString("strona");
            MatchCollection m1 = Regex.Matches(html, @"user-(.+?)", RegexOptions.Singleline);

            foreach (Match m in m1)
            {
                string email = m.Groups[1].Value;
                emaile.Add(email);
            }
            listBox1.DataSource = emaile;

I pobierało tylko jakieś literki. 

linki w górę

Opublikowano

Samo wyrażenie działa poprawnie, masz coś źle z tym WebClient'em/listą/ListBox'em.

Opublikowano

listbox na pewno działa. WebClient raczej też. Edit. Tutaj wszystko działa. Sprawdzałem. 

 

Może by zrobić tak żeby pobierał cały kod strony do txt, potem to ładować do array'a, oddzielać emaile i dopiero do listboxa? Tylko 1. Nie wiem jak zrobić żeby do listboxa wczytywał z pliku tylko emaile (coś z split?) no i 2 To pewnie strasznie spowolni program? szczególnie że jak się kliknie jeszcze raz będzie pobierał od nowa.

linki w górę

Opublikowano

Nie jest to wina kodu, (prawie)przekleiłem i działa:

982601431882958699239.png

. Tak więc coś jest źle ze stroną, bo na przykładowej stronie:

 

<html><head>
<a target="bank" id="[email protected]"  title="[email protected]" /><br />

<a target="bank" id="[email protected]"  title="[email protected]" /><br />


</body></head>

 

Działa bez najmniejszego problemu.

 

Inną opcją jest też to, że przykłady które podałeś nie do końca zgadzają się z rzeczywistością i przez to regex ich nie łapie(a ważny jest każdy znak).

Opublikowano

Nie, już sobie poradziłem :) . Okazało się że jeden znak krzaczy i przez to nie działało :) 

Temat do zamknięcia. Dzięki za pomoc.

linki w górę

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...