Regex in Java

Status
Nicht offen für weitere Antworten.

Tweedledee

Mitglied
Hallo,

bin mir nicht sicher ob dieses Unterforum das richtige ist, und ob das Problem eher Java oder Reguläre Ausdrücke betrifft. In letzterem bin ich Neuling, in Java etwas erfahrener.

Ich lese den Quelltext einer Webseite aus und suche mit folgendem Regex im nachfolgenden Code den Text zwischen den <address>-Tags ("Ethiopia"):

Code:
(?:<address>[^,]*?(?:,?[^,]*?)?,([^<]*?)</address>)|(?:<address>([^<]*)<)

Code:
[list=1][*]<h4>Emb Federal Repoblic German</h4><address>Ethiopia</address>[b]011 123 5139[/b][/list]

(www.ethiopiabook.com/whitepages/?start=1&q=0111235139)

In diesem Fall geht es nur um den Teil nach dem | , den ersten Teil brauch ich für komplexere Ergebnisse bzw. andere Webseiten.

Mit dem Tool von www.nettz.de/Service/regexp/index.cgi klappt das alles auch sehr gut, nur in meinem Java-Programm erhalte ich Fehler. Die Auswertung erfolgt über
Code:
public static String findMatches( String regexp, CharSequence s ) {
    	String tmp = "";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(s);  
        matcher.find();
        try{
        	tmp = matcher.group(1);
        }catch (IllegalStateException e) {
        	System.out.println("Exception in findMatches: " + regexp);
        }
        return tmp;
    }
Die Fehlermeldung ist:
Code:
Exception in findMatches: <address>([^,]*?(?:,?[^,]*?)?),[^<]*?</address>

betrifft also offenbar nur den ersten Teil des Oder-Ausdrucks (der bei anderen Seiten/Ergebnissen gut funktioniert).

Kann mir da jemand helfen?

(Falls es jemanden näher interessiert: ich bin dabei mein unter www.ip-phone-forum.de/showthread.php?t=129270 veröffentlichtes, in VB programmiertes Tool nochmal neu in Java zu programmieren. Im konkreten Fall geht es um die Inverssuche in 17 afrikanischen Telefonbüchern.)

Gruß Tweedledee
 
Bin jetzt zu faul das selbst zu kompilieren, ersetze
Code:
System.out.println("Exception in findMatches: " + regexp);
durch
Code:
e.printStackTrace()
um eine sinnvolle Fehlermeldung zu erhalten.
 
Ok, das schränkt es vielleicht ein wenig ein.

java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.group(Unknown Source)
...

Hilft mir aber auch nicht viel weiter, d.h. "Unknown Source" ist mir unklar. Ich habe vier Anfragen, von denen die erste (Name) ein Ergebnis bringt, die nächsten beiden (Street, Zip) korrekterweise keins, aber auch keine Exception. Nur bei der (oben dargestellten) letzten Anfrage eben. Wäre es auch einfach kein Ergebnis könnte ich den Fehler einfach auf mein Regex reduzieren. Wäre das Regex fehlerhaft würde es ja auch bei nettz.de nicht funktionieren. Oder interpretiert Java die Ausdrücke anders?
 
Sehe ich ja jetzt erst... du hast gar keine if Abfrage.
Wenn dein Regex nichts findet (was bei dir zumindest einmal passiert) kannst du nicht auf eine Matcher Group zugreifen.
Da muss ein if(matcher.find()) davor.
 
Mit if(matcher.find()) bekomme ich nur massenhaft mehr Exceptions bei anderen Abfragen (Optionen auslesen z.B.) die vorher problemlos funktionierten. Scheint mir auch nicht notwendig zu sein, denn bei 20 anderen Telefonbuch-Webseiten funktionierten die Anfragen bisher bestens, auch wenn teilweise die Regexe nichts gefunden haben. Nicht überall sind Zip-Code oder Street auslesbar. Hängt nur hier.

Ich habe mal testweise im o.g. Regex-Code den vorderen Teil (der offenbar zur Exception führt) mit dem hinteren (der in diesem Fall das 'Ethiopia' finden soll) getauscht, und das funktioniert auch. Für

name, street, zip, city erhalte ich
Emb Federal Repoblic German, , , Ethiopia

wie ich es haben möchte. Leider nicht wirklich eine Lösung, da für andere Suchanfragen der vordere Teil auch vorne stehen muss.

Hat Java da ein Problem (bzw. eine andere Interpretation) für das Zeichen '|' für 'ODER'?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben