Anzahl von 'and's and 'or's in der Datei ermitteln

Hallo,
gibt es eine brauchbare Methode, die mir die Anzahl von
„and“-s und „or“-s innerhalb einer Datei ermitteln kann?
Wie kann ich das Problem am elegantesten lösen?
Gruß,
Fabian

Hi Fabian,

da stellt sich erstmal die Frage, was du mit den „and“-s und „or“-s genau meinst?!
Meinst du a) && und ||
oder b) „and“ und „or“ als Phrase

Bei a) ist die Sache etwas einfacher, denn sollte es eine Quelltext-Datei sein, dann kannst du davon ausgehen, dass (außer in Kommentaren) alle Vorkommen gezählt werden können.
Bei b) ist das dann etwas kniffliger, denn „and“ kommt z.B. als Substring in dem String „rand“ vor.

In beiden Fällen würde ich jedoch die Verwendung von regulären Ausdrücken empfehlen (siehe ein paar Postings weiter unten) und die Datei Zeilenweise parsen.

Ciao, Bill

Matcher-Obj einen Stream übergeben!?
Hi Bill,
eigentliche will ich die Anzahl von bestimmten Tags innerhalb einer XML-Datei bestimmen. Habe auch bereits Deinen Vorschlag aufgegriefen und ich versuche es mit der regexp Bibliothek zu lösen.
Klappt auch so weit ganz gut. Ich weiß aber nicht, wie ich dem Matcher-Object den Inhalt einer Datei (also einen Stream) übergeben kann.
Der nimmt anscheinend nur Strings an?!
Gruß,
Fabian

eigentliche will ich die Anzahl von bestimmten Tags innerhalb
einer XML-Datei bestimmen. Habe auch bereits Deinen Vorschlag

Dann koenntest du doch einfach den SAX Parser verwenden.

http://java.sun.com/webservices/docs/1.0/tutorial/do…
http://java.sun.com/xml/jaxp/dist/1.1/docs/api/overv…
http://xml.apache.org/#xerces

Da gibt es dann eine Methode startElement(…String qName…)
in der du dann nach dem „qualified name“ (qName) abfragen kannst,
z.B. if (qName.equals(„bla“)) counter++; oder so.

Gruss
Patrick

aufgegriefen und ich versuche es mit der regexp Bibliothek zu
lösen.
Klappt auch so weit ganz gut. Ich weiß aber nicht, wie ich dem
Matcher-Object den Inhalt einer Datei (also einen Stream)
übergeben kann.
Der nimmt anscheinend nur Strings an?!

Hi.

Klappt auch so weit ganz gut. Ich weiß aber nicht, wie ich dem
Matcher-Object den Inhalt einer Datei (also einen Stream)
übergeben kann.
Der nimmt anscheinend nur Strings an?!

Die Grundlegende Frage bei Mustererkennung (Regular Expressions) ist ja, womit du das definierte Muster vergleichen möchtest. Ein Stream liefert das Ganze aber Stück für Stück (oder Zeichen für Zeichen). Damit kannst du auch nur immer das aktuelle Zeichen mit etwas vergleichen. Um effektiv mit RE über die ganze HTML-Datei arbeiten zu können, müßtest du den Stream in einen String schreiben (StringWriter) und dann die Regular Expression über den ganzen String vergleichen lassen.

Wenn du nach bestimmten Tags suchst, könntest du auch wegen Performance-Gründen den Stream zwischenpuffern. Dh. Jedes Zeichen abpassen, falls ein vorliegt pufferung abschließen, die RE auf den Puffer anwenden und dann weitermachen. Das funktioniert aber nur für die Erkennung einzelner Start- bzw. Endtags.

Für Einfache Parsing-Aufgaben sind xml-parser wie dom4j und Konsorten IMHO etwas zu Aufwendig.

mfG,

J.P.Jarolim

Andrerseits… wozu das Rad neu erfinden?

Mit dom4j und XPath kannst du ganz leicht die Menge von Knoten selektieren, die du suchst und dann die Anzahl der gefunden Knoten auslesen.

Dürfte dann die einfachste Lösung sein. Eine nette URL zu XPath könnte ich dir auch aus der Firma posten, wenn du möchtest.

mfG,

J.P.Jarolim