regulärer Ausdruck mit Pattern

mille

Erfahrenes Mitglied
Hallo.

Ich habe n kleinen "webclient" mit dem ich anfragen an einen Server stelle und in einen String einlese.
Aus diesem String möchte ich nun etwas ganz spezielles heraussuchen. Undzwar steht in dem String (nennen wir ihn mal s) s ein Stück HTML Quellcode der art: "<span class="s2gb">float zahl</span>". Dieses TAG ist einzigartig.(einzige Änderung die möglcih ist, ist statt der CSS class "s2gb" noch "s2rb".

Ich habe bisher folgenden Quellcode:
Java:
    // s = der uebergebene HTML quellcode
    public static String getValue(String s){
        
        Pattern p = Pattern.compile("<span class=\"s2(r|g)b\">(.*?)</span>");
        String [] value = p.split (s);
        for(int i = 0; i < value.length; i++){
            System.out.println("--------------------\n\n\n"+value[i]+"\n-----\n\n\n\n");
            
            if(value[i].length() < 9)
                return value[i];
        }
                
        return "fehler";
    }// end getValue

Leider gibt mir diese Funktion nicht den gesuchen Zahlenwert zwischen den SPAN Tags zurück, sondern immer "Fehler". Kann mir einer helfen?
 
Hoi,
also wenn ich als String Beispielsweise folgendes habe, macht er bei mir alles richtig.

Code:
<html><head><span class=\"s2gb\">343347894443</span></head></html>

Könnte es sein das du eher den Zahlenwert bzw. die CSS-Style-Klasse auslesen möchtest? Dann müsstest du das ungefähr so machen:

Code:
    public static String getValue(String s){
    	
        Pattern p = Pattern.compile("<span class=\"s2(r|g)b\">(.*?)</span>");
        Matcher m = p.matcher( s );
        if( m.find() ){
        	String styleClass = m.group( 1 );
        	String value = m.group( 2 );
        	
        	System.out.println( styleClass );
        	System.out.println( value );
        	
        	return "wooot, it works!";
        }
        else{
        	return "damn... error";
        }
        
    }

Weis leider nicht genau was du wolltest, könnte sein das ich es falsch verstanden habe.

Gruß Manuel
 
Hallo,

also ich würd das so machen:
Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author thomas.darimont
 * 
 */
public class RegexExample {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String s = "<html><head><span class=\"s2gb\">-213312.343347894443</span></head></html>";
		String regex = ".*<span class=\"s2[rg]b\">(-?\\d*\\.?\\d+)</span>.*";
		System.out.println(s.replaceAll(regex, "$1"));
	}
}

Gruß Tom
 
Hallo.

das funktioniert leider nicht.
:(
Der Teststring is vermutlcih zu trivial.
Geht mal bitte auf http://www.onvista.de sucht nach irgend einer Aktie und nehmt mal den HTML Quellcode als Teststring :).
Das Feld, das den aktuellen Kurs einer aktie angibt, ist eben gerade durch <span class="s2g/rb">KURS</span> definiert. g bzw r steht dann für grün (Bei positiven Wachstum) oder rot (bei negativem wachstum).

Vielleicht könnt ihr mir helfen :-). Den regulären Ausdruck bekomme ich leider auch nicht funktionstüchtig :-(
 
Hallo,

ich denke nicht das du sowas darfst... deshalb hier ein anderes Beispiel.
Java:
 /**
 * 
 */
package de.tutorials;

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Tom
 * 
 */
public class AnotherRegexExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(
                "&nbsp;<a href=\"http://BUBU.windows.br/app.html?DIE_NATION=20735\">PI</a></td><td>3.141592643538&nbsp;</td><td>");
        String regex = "<a href=\"http://BUBU\\.windows\\.br/app\\.html\\?DIE_NATION=\\d+\">([^<]*)</a></td><td>([^&]*)&nbsp;</td>";
        Pattern pattern = Pattern.compile(regex);
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            Matcher matcher = pattern.matcher(line);
            while (matcher.find()) {
                System.out
                        .println(matcher.group(1) + " -> " + matcher.group(2));
            }
        }
        scanner.close();
    }
}

Gruß Tom
 
War auch grad noch am tippen und poste es deshalb mal, will es ja net umsonst gemacht haben :P

Habe mir einfach mal den Quelltext der Seite in die Datei "C:/test.txt" gespeichert" und dann folgenden Code ausgeführt. Funktioniert :)

Java:
import java.io.File;
import java.io.FileReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;



public class SpanRegex {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		
		// enthaelt den HTML-Code
		StringBuffer content = new StringBuffer();
		
		// Lesen des HTML-Codes in den StringBuffer
		File file = new File( "C:/test.txt" );
		FileReader fileReader = new FileReader( file );
		char[] buffer = new char[1];
		while( fileReader.read(buffer, 0, 1) != -1 ){
			content.append(buffer);
		}
		
		// Aufrufen der getValue methode, welchen den Wert + r/g liefert.
		String value = getValue( content.toString() );
		System.out.println( "Der Wert ist: " + value );
		
	}
	
    public static String getValue(String s){
    	
        Pattern p = Pattern.compile("<span class=\"s2(r|g)b\">(.*?)</span>");
        Matcher m = p.matcher( s );
        if( m.find() ){
        	String styleClass = m.group( 1 );
        	String value = m.group( 2 );
        	
        	System.out.println( styleClass );
        	System.out.println( value );
        	
        	return value;
        }
        else{
        	return "damn... error";
        }
        
    } 

}

Gruß Manuel
 
Also ich hab das Problem lokalisiert, aber nicht behoben.

Wenn ich den Quellcode von dir nehme gainwar und ne Datei auslese (mit exakt dem, was mir der Server liefert in jene Datei gespeichert), dann kommt das richtige Ergebnis.

Wenn ich die Serverantwort direkt bearbeite funktioniert es nicht. Also muss der String, wenn er aus ner Datei ausgelesen wird, irgendwie anders sein, ich weiss nur nich wie :D.

Hier mal der Teil, der die Serverantwort einliest:

Java:
inputStream = new BufferedInputStream(socket.getInputStream());
        outputStream = new PrintWriter(new BufferedOutputStream(socket.getOutputStream()),true);            

        outputStream.println("HTTP ANFRAGE");
        do{
            serverResponse.append(inputStream.read());
        } while(inputStream.available() > 0);

getValue(serverResponse.toString); // gibt nicht das gesuchte ergebnis


PS: warum sollte ich das nicht dürfen? ich nutze es ausschließlcih für mich privat und es kann nicht untersagt werden Textbrowser zu nutzen.

mfg
 
Guten Morgen,
also hab jetzt mal wieder was zusammen gebastelt. Folgendes funktioniert bei mir.

Java:
package de.test;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 
 * @author M.Freiholz - Gainwar
 *
 */
public class RegexExample {

	public static void main(String[] args) throws Exception {
		
		// HTTP-Request
		StringBuffer request = new StringBuffer();
		request.append( "GET /regexexample.html HTTP/1.1\n" );
		request.append( "User-Agent: Opera/9.02 (Windows NT 5.1; U; en)\n" );
		request.append( "Host: localhost\n\n" );
		
		// HTML Seiteninhalt
		StringBuffer content = new StringBuffer();
		
		// Verbindungsaufbau.
		Socket socket = new Socket( "localhost" , 80 );
		
		// Senden des HTTP-Requests
		OutputStream os = socket.getOutputStream();
		os.write( request.toString().getBytes() );
		os.flush();
		
		// Empfangen der Antwort
		InputStream is = new BufferedInputStream( socket.getInputStream() );
		byte[] buffer = new byte[128];
		int got = 0;
		while( is.read( buffer , 0 , 128 ) != -1 ){
			content.append( new String(buffer) );
		}
		
		// Ausgabe der Antwort
		//System.out.print( content.toString() );
		
		// Value...
		String value = getValue( content.toString() );
		System.out.println( "value = " + value );
		
	}
	
    public static String getValue(String s){
        
        Pattern p = Pattern.compile("<span class=\"s2(r|g)b\">(.*?)</span>");
        Matcher m = p.matcher( s );
        if( m.find() ){
            String styleClass = m.group( 1 );
            String value = m.group( 2 );
            
            System.out.println( styleClass );
            System.out.println( value );
            
            return value;
        }
        else{
            return "damn... error";
        }
        
    } 

}

Das zusammenfügen des Content-Strings sollte schöner gelöst werden.

Gruß Manuel
 
Problem habe ich gelöst.

Danke :).
Hauptproblem war, dass ich dem Server keine Parameter mitgegeben habe. ich habe immer nur die HTML datei abgefragt ohne die Parameter nach dem Fragezeichen mitzugeben.


Anmerkung:
Wieso gebt ihr an, was für ein Browser ihr "imitiert"? Bei mir gibts keine Informationen darüber. Am Webserver fragt immer nur jemand an, der sich als gar nichts ausgibt ;-)
 
Zurück