Regulaere Ausdruecke und Weiterverarbeitung

Status
Nicht offen für weitere Antworten.

m0mo

Neues Mitglied
Hallo Leute,

erstmal wuensch ich allen frohe Weihnachten. :)
Und auch wenn jetzt eigentlich die Zeit der Entspannung und Geruhsamtkeit herrschen sollte, haelt mich ein Programmierproblem vom vollstaendigen Glueck ab.

Ich bin ein ziemlicher JavaNeuling (komme eher aus der einfacheren imperativen PHP Programmierung) und muss nun ein kleines Datenverarbeitungsscript unter der Verwendung von Regulaeren Ausdruecken (hier ebenfalls nicht allzu konform) programmieren. Am besten ich schildere mal kurz das Problem:

Ich habe mehrere HTML Seiten die nach Daten durchsucht werden sollen. Dabei geht es um ziemlich grosse Seiten mit vielen Informationen - ich benoetige aber nur bestimmte, d.h. ich muss meine regulaeren Ausdruecke ziemlich explizit deklarieren. Z.B. versteckt sich im Quelltext eine Nummer, die ich haben moechte in folgender Struktur:

Code:
<tr><td align="left"><span style="font-size:12px;">[b]Nummer:&[/b]#15stelligeNummer#</span></td></tr>

Die Nummer kommt im Quelltext oefters vor und das ist fuer jede Seite unterschiedlich. Dieses Konstrukt macht es aber eindeutig. Nun lese ich also den Quelltext mit Java ein und habe mir schon einen (sehr) kleinen regulaeren Ausdruck geschrieben:

Code:
public Map<String,String> extract_data(DirectoryManager directory) 
 	{
 		
 	  	Map<String, String> regExp = new HashMap<String, String>();
      
      	regExp.put( "Nummer", "<tr><td align=\"left\"><span style=\"font-size:12px;\">[b]Nummer:&[/b]\\d{10,15}</span></td></tr>");	
		
Map<String,String> matches = new HashMap<String,String>();
 	 	
 	 	int number = directory.read_directory(dir);
 		
		for(int i=0;i<number;i++)
  		{
			System.out.println("(" + (i+1) + ") Currently working on file: " + directory.get_filename(i));
 			
 			for (String expression : regExp.values())
			{
				Pattern pattern = Pattern.compile(expression);
            	Matcher matcher = pattern.matcher(directory.read_file(i));
            
            	while (matcher.find())
            	{
               	System.out.println("I found the text " + matcher.group());
            	}
			}
    }  		
 	return matches;
 	}

Das funktioniert soweit schonmal. :) Nun gibt es aber folgendes Problem: Ich brauche nur den Wert, der in Nummer drinsteht - habe aber keine konkrete Ahnung, wie ich den aus meinem SuchPattern extrahiert bekomme. Ich habe zwar schon wage Ideen, wie man es irgendwie mit Scanner oder appendReplacement() realisieren koennte, diese kommen mir aber nicht wirklich professionell vor - und deswegen wollte ich fragen, wie sowas am elegantesten geloest wird. Ueber Tipps und Anregungen waere ich sehr dankbar. Ich wuensch euch noch ein paar schoene Weihnachtstage.

mfg
m0mo
 

Ark

Top Contributor
Mit Capturing Groups (oder wie die heißen) kann man das machen. In der Java-API-Dokumentation zu java.util.regex.Pattern sollte das erklärt sein. Klammere den gesuchten Teilausdruck mit ( und ) ein und lass ihn dir nach einem match mittels group() (oder wie die Methode heißt) ausgeben. Wenn dies der erste geklammerte Ausdruck sein sollte, wird das wohl Gruppe Nr. 1 sein.

Ark
 

m0mo

Neues Mitglied
Vielen Dank Ark!
Funktioniert wunderbar. :)

Eine weitere Frage haette ich nun noch:
Wie man im Quelltext oben sieht, definiere ich die HashMap in der Methode extract_data.Eigentlich wollte ich sie im Konstruktor von DataManager definieren, bekomme, wenn ich dies mache allerdings folgenden Fehler:

Code:
DataManager.java:47: cannot find symbol
symbol  : variable regExp
location: class DataManager
                        for (String expression : regExp.values())
                                                 ^
1 error

nun habe ich es auch schon mit this.regExp versucht, allerdings kommt der Fehler immer noch.
Ich muss zugeben, genau kenne ich mich mit den ganzen moeglichen Deklarationen nicht aus - nur eigentlich wird die HashMap doch erstellt, kann also nicht in der obersten Klasse erstellt werden, wo man normalerweise globale Variablen definiert, oder? (weil in der Hauptklasse nur deklariert und nicht initialisiert wird - wenn ich das richtig verstanden hab)

Wie kann ich diesen Fehler irgendwie noch beheben?

Danke schonmal!
m0mo
 
S

SlaterB

Gast
in Konstruktoren und Methoden legt man lokale Variablen an, die in anderen Methoden nicht sichtbar sind,
Klassenattribute muss man außerhalb von Methoden/ Konstruktoren direkt in der Klasse definieren,
wie in jedem Lehrbuch nachzulesen :bae:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Erste Schritte Weiterverarbeitung Resultset Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben