Anzeige:
Ergebnis 1 bis 15 von 15

Thema: Java & regex

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    377

    Java & regex -> xml substring filtern

    Ich versuche gerade einen Xml-substring auf seine vollstaendigkeit zu pruefen.
    Der grund ist, dass ich von einem Stream lese der mir immer nur teilstuecke liefert.
    Dazu verwende ich einen StringBuffer um den XML-String zusammenzusetzen.

    Regex war noch nie wirklich meine Staerke, und deshalb bitte ich euch um eure Hilfe!
    Mein Momentaner stand ist folgender:
    Code:
    public class RegexTest {
    	public static void main(String[] args) {
    		// String regex = "<MSG(>|\\sID=\"\\d\">)[\\p{ASCII}[^(</MSG>)]]+";
    		// String regex = "<MSG(>|\\sID=\"\\d\">)[\\p{ASCII}&&[^</MSG>]]*";
    		// String regex = "[<MSG(>|\\sID=\"\\d\">)]{1}[\\p{ASCII}]+</MSG>";
    		   String regex = "<MSG>|<MSG\\sID=\"\\d\">[\\p{ASCII}]*</MSG>";
    		String message = "d><MSG><MSG ID=\"2\"><INFO><TYPE> 6 </TYPE></INFO></MSG><MSG ID=\"1\"><INFO><TYPE>7</TYPE></INFO></MSG></MSG>";
    		
    		System.out.println( "Regex: " + regex );
    		System.out.println( message + "\nmessage end\n" );
    		
    		Pattern pattern = Pattern.compile( regex );
    		Matcher matcher = pattern.matcher( message );
    		
    		while ( matcher.find() ) {
    			String m = matcher.group();
    			System.out.println( m );
    		}	
    	}
    }
    Nun ist die Ausgabe aber folgende:
    Code:
    <MSG>
    <MSG ID="2"><INFO><TYPE> 6 </TYPE></INFO></MSG><MSG ID="1"><INFO><TYPE>7</TYPE></INFO></MSG></MSG>
    und nicht
    Code:
    <MSG ID="2"><INFO><TYPE> 6 </TYPE></INFO></MSG>
    <MSG ID="1"><INFO><TYPE>7</TYPE></INFO></MSG>
    Ich hoffe mir kann dabei einer Helfen! Ich werde zwar weiter probieren, bin aber sicher ihr seit 100mal schneller als ich!

    mfg
    nul
    Geändert von nul (22-06-2006 um 18:42 Uhr)
    Amilo D - 2,8 Ghz - ATI Radeon 9000
    Debian GNU/Linux 3.1 (Sarge)

  2. #2
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Hab ich das richtig verstanden: Du liest den String stückchenweise von irgend einer unsicheren Quelle ein und willst prüfen, ob du auch den ganzen hast? Ich würd vorher und nachher nen Hash-Code drüberlaufen lassen und den vergleichen - dürfte massiv schneller und zuverlässiger sein.

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  3. #3
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    377
    Hash-Code? Wie soll das gehn? Quellen sind zum beispiel Devices vom Betriebssystem, ne andere ist eine Netzwerkverbindung ...
    Der Text zwischen <MSG ID="X">...</MSG> kann ist variabl sein, auf den hab ich keinen Einfluss ...
    Amilo D - 2,8 Ghz - ATI Radeon 9000
    Debian GNU/Linux 3.1 (Sarge)

  4. #4
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Dann musst du mir nochmals erklären, was genau du machen willst; Einfach nur prüfen, ob sämtliche Tags wieder geschlossen sind?

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  5. #5
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    377
    so in etwa, aber der starttag muss <MSG="ID"> und der schlusstag </MSG> sein!
    Amilo D - 2,8 Ghz - ATI Radeon 9000
    Debian GNU/Linux 3.1 (Sarge)

  6. #6
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Zitat Zitat von nul
    so in etwa, aber der starttag muss <MSG="ID"> und der schlusstag </MSG> sein!
    Und dafür brauchst du nen regex? Das sollte doch einfachst mittels Rekursion zu machen sein (so etwa 10 Zeilen Code - ohne Garantie )

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  7. #7
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    377
    Ich denke regex ist aber dabei schneller - warum ich jetzt hier von Geschwindigkeit rede ist dir erst klar wenn ich dir erzaehle zuwas das alles sein soll ...
    Amilo D - 2,8 Ghz - ATI Radeon 9000
    Debian GNU/Linux 3.1 (Sarge)

  8. #8
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Zitat Zitat von nul
    Ich denke regex ist aber dabei schneller
    glaub ich nicht... wär aber einen Versuch wert...
    - warum ich jetzt hier von Geschwindigkeit rede ist dir erst klar wenn ich dir erzaehle zuwas das alles sein soll ...
    Na dann los

    MfG Bischi

    PS: Erstellst du die XML-Tags eigentlich selbst? Oder bekommst du den String schon fixfertig? Falls ja, wär ein Hash-Code zumindest für die Netzwerkvariante wohl das schnellste (ist übrigens in TCP/IP so gemacht...).

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  9. #9
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Wie wärs wenn dus richtig mit einem XML-Validator machst und einem Schema, mit dem MSG-Tag als mandatory und dazwischen alles andere?

    Die gibts fixfertig, sind auf Geschwindigkeit hin optimiert und überprüfen all das, was du brauchst.

    Ansonsten herumprobieren. Das führt mit Regex am schnellsten zum Erfolg.
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  10. #10
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    377
    Ok, dann mal los ...
    Ihr kennt doch sicher Echtzeit-Betriebssysteme, oder? Um es einfach zu sagen, ich muss fuer eine Erweiterung einer Erweiterung ein Programm zur Visualisierung und Steuerung schreiben.

    Auf den XML-String habe ich so gut wie keinen Einfluss - und um genau zu sein, ist das nicht mal ein gueltiger xml-stream den ich empfange. Es sind nur die Teile die ich filtere gueltig. Deshalb kann ich auch erst nachdem ich die Nachricht gefiltert habe an einen XML-Parser (Sax oder Dom, was auch immer) denken!

    Grundsaetzlich braeuchte ich ja nur einen Ausdruck in Java Regex der mir eine Zeichenkette (</MSG> negiert und nicht die einzelnen zeichen ([^</MSG>]).

    P.S.: Fuer das "Java-Echtzeit-Programm" (wer erkennt an dem Wort noch den Witz?) verwende ich dabei nicht TCP/IP - wegen der Verzoegerung. TCP muss doch immer die Pakete quittieren, und das dauert halt laenger als bei UDP - na ihr wisst schon ...
    Geändert von nul (22-06-2006 um 20:44 Uhr)
    Amilo D - 2,8 Ghz - ATI Radeon 9000
    Debian GNU/Linux 3.1 (Sarge)

  11. #11
    Registrierter Benutzer Avatar von mwanaheri
    Registriert seit
    28.10.2003
    Ort
    Bayreuth
    Beiträge
    569
    Wenn die Zeichenkette mit </MSG> enden muss, kannst du das doch einfach mit String.substr(String.length - 6,5).equals("</MSG>") prüfen. Analog auch den Anfang. Alles, was dem nicht entspricht, fliegt raus.
    Den Rest würde ich entweder mit split("<") aufteilen und dann auf finales > prüfen oder durch einen StringTokenizer jagen. Das prüft natürlich nur die Klammern und ist nicht wirklich eine Gültigkeitsprüfung.

    Diese Klassen brauchen zwar Speicher, ich finde sie aber recht flott. Das ganze ist sehr wartbar. RegEx sind zwar supermächtig, aber ich bin mir nicht sicher, ob sie wirklich schneller sind. Mächtigkeit hat auch seine Anforderungen.
    Geändert von mwanaheri (22-06-2006 um 21:42 Uhr)
    Das Ziel ist das Ziel.

  12. #12
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    377
    Hab jetzt mal ne Mischung aus Regex StringTokenizer StringBuffer und XML Parser verwendet - fuer den Moment bin ich damit zufrieden.
    Wenn mir das dann mal zu langsam ist kann ich das ja immer noch spaeter aendern!

    Danke an alle fuer eure Hilfe!!!
    Amilo D - 2,8 Ghz - ATI Radeon 9000
    Debian GNU/Linux 3.1 (Sarge)

  13. #13
    Registrierter Benutzer Avatar von mwanaheri
    Registriert seit
    28.10.2003
    Ort
    Bayreuth
    Beiträge
    569
    Nachtrag: Wenn du nicht multithreaden musst und du Java 5 verwenden kannst, ist laut Doku der Stringbuilder (Aufrufgleich mit StringBuffer) performanter als der StringBuffer.
    Das Ziel ist das Ziel.

  14. #14
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    377
    Verwende schon Java 5, aber Threads muessen sein. Theoretisch koennte ich auch mit Signalen arbeiten - aber damit habe ich sehr schlechte erfahrungen gemacht. Ich weiss gar nicht wie oft mir dabei die VM schon abgestuerzt ist.
    Mindestens 5 Mal? Ich finde jedenfalls im Projekt noch 5 Crash-Logs davon - wobei ich sicher welche schon geloecht habe!
    Ausserdem haette das den Nachteil dass ich zum Beispiel fuer die Netzwerkverbindung wieder was anderes erfinden muesste.

    Wenn ichs so mache wie es geplant ist dann kann ich fuer alle geplanten Verbindungsarten die gleiche Implementierung verwenden, ich muss nur dem Thread den richtigen Stream uebergeben.
    Amilo D - 2,8 Ghz - ATI Radeon 9000
    Debian GNU/Linux 3.1 (Sarge)

  15. #15
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Zitat Zitat von nul
    Ok, dann mal los ...
    Ihr kennt doch sicher Echtzeit-Betriebssysteme, oder? Um es einfach zu sagen, ich muss fuer eine Erweiterung einer Erweiterung ein Programm zur Visualisierung und Steuerung schreiben.
    Echtzeitbetriebssysteme sind doch immer wieder toll...
    Fuer das "Java-Echtzeit-Programm" (wer erkennt an dem Wort noch den Witz?)

    verwende ich dabei nicht TCP/IP - wegen der Verzoegerung. TCP muss doch immer die Pakete quittieren, und das dauert halt laenger als bei UDP - na ihr wisst schon ...
    Ich würde mal behaupten, dass TCP/IP auf heutigen Systemen schneller ist, als UDP mit Java... (es muss ja nicht jedes mal das Paket bestätigt werden - die Netzwerkkarte hat ja glücklicherweise einen Buffer...). Und vor allem zuverlässiger... (afaik musst du ja beim Empfangen nicht warten - lediglich der Sender wartet auf die Antwort - und das kleine bisschen Checksumme dürfte doch Hardwaremässig gemacht werden...)

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •