2010-12-05 11 views
0

Ich bin ein beginnender Programmierer, der versucht, eine HTML-Datei in einer Processing-Skizze zu analysieren. (Übrigens, wenn Sie Processing nicht kennen, kompiliert es nach Java und verwendet die gleichen Regex-Funktionen). Ich habe die HTML-Datei korrekt als einen einzelnen String mit SimpleML erfasst. Die Daten, die ich zu erfassen bin versucht, kommt aus einer Tabelle, wie so:Hilfe mit Regex in einer Verarbeitungsskizze?

<th>Name</th> 
    <th>John F. Kennedy</th> 
    <th>Lyndon Johnson</th> 
    <th>Richard Nixon</th> 

usw.

Ich möchte die Namen der Kandidaten in einem Array parsen (Fallenlassen der „Name“).

Also versuchte ich zuerst

candidates = match(rawString,"<th>.*</th>"); 

, die die ganze Liste zurückgegeben.

Dann habe ich versucht

candidates = match(rawString,"<th>.{1,50}</th>"); 

die Dokumentation nur

<th>Name</th> 

Die Verarbeitung kehrt sagt:

Wenn es Gruppen (durch Sätze von Klammern angegeben) in der regexp, dann wird der Inhalt jedes einzelnen im Array zurückgegeben. Das Element [0] einer regexp-Übereinstimmung gibt die gesamte übereinstimmende Zeichenfolge zurück, und die Übereinstimmungsgruppen beginnen bei Element [1] (die erste Gruppe ist [1], die zweite [2] usw.).

So, jetzt verschiedene Kombinationen von Gruppen und quantifiers versucht, ich habe, wie:

candidates = match(rawString,"(<th>.{1,50}</th>)*"); 

Aber es muss ein konzeptionelles Stück, das ich immer bin nicht sein, weil nichts funktioniert. Scheint so, als sollte das einfach sein, oder?

+0

Verstrebungen für anti-regex-and-html Menge –

Antwort

1

Das Analysieren von HTML mit regulärem Ausdruck ist normalerweise keine gute Idee, aber Sie kommen hier vielleicht durch.

Ihr Problem scheint gewesen zu sein, dass .* gierig passt, ich. e. so viele Zeichen wie möglich, damit alles von der ersten <th> bis zum allerletzten </th> in Ihrer Zeichenfolge übereinstimmt.

machen es faul, ich. e. dem Quantifizierer zu sagen, dass er so wenig wie möglich zusammenpasst, ist eine Lösung:

würde wahrscheinlich funktionieren.

Ein bisschen stabile und minimal schneller: der Motor genau sagen, was es zum Beispiel passend ist erlaubt,:

<th>[^<>]*</th> 

[^<>] bedeutet „alle Zeichen außer spitzen Klammern“.

Sie werden Probleme bekommen, wenn Sie versuchen, verschachtelte Strukturen mit regulären Ausdrücken zu vergleichen. Es kann in modernen Regex-Aromen gemacht werden, aber es ist sehr schwer, richtig zu machen. Fügen Sie dem Mix HTML-Kommentare und Zeichenfolgen hinzu (die möglicherweise genau die Trennzeichen enthalten, mit denen Sie übereinstimmen), und Sie werden eine Welt voller Verletzungen erleben.

+0

Okay, also ich bin immer das Gefühl der Gemeinschaft, die + regex HTML = Probleme. Was wäre eine bessere Methode? – James

1

Wahrscheinlich möchten Sie die matchAll Methode, wenn Sie Ihren Ausdruck mehrere Male erwarten. match erwartet nur, dass Ihr Muster einmal übereinstimmt, sodass nur das erste gefundene Ergebnis zurückgegeben wird.

http://www.processing.org/reference/matchAll_.html

+0

Dies scheint das prominentere Problem zu sein, dem James begegnet. –