Hallo,
ich lese hier eine Internetseite ein:
System.Net.WebClient x = new System.Net.WebClient();
string inhalt = x.DownloadString(new Uri(listBox1.SelectedItem.ToString()));
MessageBox.Show(inhalt);
MatchCollection paramValues = Regex.Matches(inhalt, @"(<form).*?(/form>)");
leider hat paramValues.Count=0 obwohl eine Form enthalten ist.
Was ist falsch an meiner Regex?
Unsere Website
iPhone Programmierung | Android Programmierung
Hallo Ploetzi,
such mal nach "LINQ to HTML" auf StackOverflow.com. Da findest du einige Beispiele, wie du sowas einfacher realisieren kannst. RegEx finde ich ein wenig zu kompiliziert und für solche Sachen "falsch". Viele verwenden RegEx für solche Sachen, aber es geht auch einfacher.
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Danke, dass schau ich mir an.
Trotzdem würd mich interessieren, wieso funktioniert dass nicht:
string inhalt2 = (new System.Net.WebClient()).DownloadString(new Uri("http://blog.gsdh.de/2010/10/19/iphone-developer-conference-2010/"));
MessageBox.Show("Inhalt:" + inhalt2);
MatchCollection paramValues = Regex.Matches(inhalt2, @"<form(.*?)/form>");
MessageBox.Show("laenge:" + paramValues.Count);
Unsere Website
iPhone Programmierung | Android Programmierung
Weil in dem HTML Newline Zeichen vorkommen.
Der "." steht normalerweise für ein beliebiges Zeichen außer "\n".
Nutze RegexOptions.Singleline, dann steht "." auch für "\n" und der Ausdruck trifft.
using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
RegEx ist tückisch, gerade bei solchen Sachen.
Wenn du irgendwo ein (.) einbaust, enthält der Ausdruck jede mögliche Zeichenanordnung und daher auch das </form>. Deswegen frisst dir das . den ganzen String auf und der letzte Teil, das </form>, verhindert dann, dass das ganze matched, da ja keine Zeichen mehr da sind mit auf die der Ausdruck passen könnte.
As a man thinketh in his heart, so he is.
Deswegen frisst dir das .* den ganzen String auf[...]
Das gierige Verhalten wurde jedoch schon durch das Fragezeichen in .*?
schon ausgeschalten.
Aber selbst wenn: Das </form>
würde _nicht _gefressen werden. Falls es mehrere </form>
gibt, würde beim gierigen Verhalten alles bis zum letzten </form>
matchen, beim nicht gierigen würde beim ersten aufgetretenen </form>
gestoppt.
Hallo Ploetzi,
such mal nach "LINQ to HTML" auf StackOverflow.com. Da findest du einige Beispiele, wie du sowas einfacher realisieren kannst. RegEx finde ich ein wenig zu kompiliziert und für solche Sachen "falsch". Viele verwenden RegEx für solche Sachen, aber es geht auch einfacher.
zero_x
Dazu: RegEx heißt Regular Expression. HTML ist aber nicht regular, es ist ein Baum. Also benutzt man einen DOM-Parser stattdessen. Macht das Ganze vieeeel einfacher. Dazu linke ich gerne
http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags
So ganz verstehe ich nicht warum dass zutreffen sollte mit dem nicht so gierigen .* da ja der Ausdruck (.)? da steht und damit der Teil (.) einmal oder keinmal vorkommt, was ja nichts an den darin enthaltenen Zeichenketten ändert.
Ich hatte genau so ein Problem schon einmal mit PHP. (Wo es dann das .* war ...)
So ganz verstehe ich die Erklärung also nicht. 🤔
As a man thinketh in his heart, so he is.
[...]da ja der Ausdruck (.*)? da steht[...]
Nein, da steht aber nicht (.*)?
, sondern .*?
. Du kannst das als Schlüsselwort verstehen, dass gieriges Verhalten ausschaltet.
Siehe Anhang (Ausschnitt RegexLab). Unten gieriges Verhalten, oben genügsames Verhalten.
Und wie du siehst: Selbst bei gierigem Verhalten matched das Pattern korrekt. Das Problem, warum das Pattern bei Ploetzi nicht matched, sind die Zeilenumbrüche.
Zum Thema HTML mit Regex parsen:
Zitat von: Coding Horror: Parsing Html The Cthulhu Way
You can't parse [X]HTML with regex. Because HTML can't be parsed by regex. Regex is not a tool that can be used to correctly parse HTML. As I have answered in HTML-and-regex questions here so many times before, the use of regex will not allow you to consume HTML.
Gruß,
dN!3L