Anzeige:
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 15 von 31

Thema: RegEx Problem

  1. #1
    Registrierter Benutzer
    Registriert seit
    12.03.2003
    Ort
    Delligsen
    Beiträge
    62

    RegEx Problem

    hiho zusammen,

    vieleicht könnt ihr mir bei meinem kleinen problemchen helfen.
    also, als erstes mal ne kleine exkursion zu dem endziel.
    ich möchte ein kleines protokoll entwickel, um die kommunikation mit verschiedenen datenquellen zu vereinheitlichen (die datenquellen sind einem von mir geschriebenen applikationsframework zugehörig) es funktionert auch recht gut. das einzige, was mich noch stört ist das ganze rumgefummel an den request strings, nun hab ich mir überlegt, dass das ganze doch mit regexp's wahrscheinlich leichter zu handlen sei.
    aber pustekuchen, mein ausdruck hat nie einen match, nur weiß ich leider net, an welcher stelle es hackt (der syntaxparser beschwert sich nicht, also muss es ein gültiger ausdruck sein).

    so, nun zum konkreten problem:
    ich habe einen protokoll string, der in etwa so aussieht

    hpf-net://req="run";object[objname="obj1",obj="{serialisiertes Objekt}"]

    nun würde ich gerne ein paar dinge herausfinden wenn ich ein request bekomme:
    1. ist der request string von meinem protokoll
    2. was steht in ihm (am besten gleich splitten)

    aber mein ausdruck(eine zeile drunter) stellt nicht einmal fest ob der string gültig ist
    "^hpf(-net|-db)://.*"

    kennt einer von euch vieleicht ein gutes tutorial für regex ?

    mfg
    hpf

  2. #2
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    tutorials gibt es zu hauf.

    einfach google befragen.

    Ansonsten empfehl ich dir die API, wo die Unterschiede von Java zu Perl-Regex ganz gut erklärt werden. Ich verwende zum Testen gerne dieses Applet

    Deine Regex sagt in der Gruppe derzeit nur, dass es ein -net-Aufruf ist.

    Jetzt kommt es natürlich darauf an, was du genau möchtest.

    Wenn du folgende Ausgabe z.B. möchtest:

    Code:
    group(0) = "hpf-net://req="run";object[objname="obj1",obj="{serialisiertes Objekt}"]"
    group(1) = "-net"
    group(2) = "obj1"
    group(3) = "serialisiertes Objekt"
    folgende Regex verwenden:
    Code:
    ^hpf(-net|-db)://.*objname="(.*)",obj="\{(.*)\}".*
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  3. #3
    Registrierter Benutzer
    Registriert seit
    12.03.2003
    Ort
    Delligsen
    Beiträge
    62
    erstmal vielen dank für den link, das applet is echt spitze, inzwischen klappt das auch ganz gut, nun habe ich aber ein kleines/großes problem, mit dem preparierten string "hpf-net://req="run";object[objname="obj1",obj="{serialisiertes Objekt}"]"
    klappt es nun aber wenn ich den teil {serialisiertes Objekt} durch ein echtes serialisiertes object (den bytarray output als string) ersetzte, schlägt es wieder fehl kann man ihm in dem regex noch beibiegen, dass ihm absolut egal ist was für zeichen in einem bestimmten abschnitt verwendet werden ?

    mfg
    hpf

  4. #4
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    .* heißt eigentlich schon irgendwelche zeichen, und zwar beliebig oft.

    Kannst du mal ein Beispiel für so einen Bytearray bringen?
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  5. #5
    Registrierter Benutzer
    Registriert seit
    29.09.2006
    Ort
    Helsinki
    Beiträge
    154
    Moin!

    @hpf:
    Nimm's mir nicht übel, aber als Informatik-Student finde ich Deinen gesamten Ablauf etwas "unelegant".

    Ich persönlich würde an derartige Probleme in zwei Schritten herangehen:

    Als erstes würde ich den String durch einen handgemachten Tokenizer zerlegen und dann im zweiten Schritt mit den Tokens weiterarbeiten. Das ist übrigens auch gleich eine gute Kontrollmöglichkeit, denn in dem Moment, in dem Du feststellst, dass sich Dein String nicht eindeutig zerlegen lässt, müsstest Du Deine Syntax nochmal überdenken, Du sicherst Dich also nochmal gegen nicht eindeutige Syntax ab.

    So long,
    Liberty

    P.S.:
    Hast Du irgendwo Deine Syntax schonmal vernünftig dokumentiert, sieht im Moment ehrlich gesagt ein klein wenig unsauber aus...
    Friedliebender Soldat im ganz persönlichen Auslandseinsatz

  6. #6
    Registrierter Benutzer
    Registriert seit
    12.03.2003
    Ort
    Delligsen
    Beiträge
    62
    @Liberty keine sorge, ich nehm dir nix übel, aber das hab ich schon getan ^^ aber mit regex würde ich den code (bis auf die expression selbst) extrem siplifizieren ^^

    mfg
    hpf

  7. #7
    Registrierter Benutzer
    Registriert seit
    12.03.2003
    Ort
    Delligsen
    Beiträge
    62
    hmm, der string lässt sich net vernünftig aus der console kopieren, der scheint escape sequences zu enthalten, aber ich hab mal nen bild gemacht. ich bräuchte im prinzip nen "ignore ascii mode für den part".



    mfg
    hpf

  8. #8
    Registrierter Benutzer
    Registriert seit
    29.09.2006
    Ort
    Helsinki
    Beiträge
    154
    Moin,

    das könnte ja auch der Grund sein, warum Du mit den RegExp's Probleme hast.

    Ich gehe mal davon aus, dass Deine Protokoll-Strings grundsätzlich "human-readable" sein sollen und evtl. auch als reine Text-Strings verarbeitet werden sollen.
    Deshalb solltest Du vielleicht mal überlegen, ob Du die problematischen Teile nicht in einen int64-Code umwandeln solltest, bevor Du sie in Deinem String verwendest. Das könnte evtl. die Verarbeitung durch RegExp's erleichtern.

    So long,

    Liberty
    Friedliebender Soldat im ganz persönlichen Auslandseinsatz

  9. #9
    Registrierter Benutzer
    Registriert seit
    12.03.2003
    Ort
    Delligsen
    Beiträge
    62
    der tip mit der int64 konvertierung is gut, das müsste ich mal ausprobieren.

    mfg
    hpf

  10. #10
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    @Liberty:

    Als fertiger Dipl.-Ing. finde ich die Vorgehensweise über einen regulären Ausdruck extrem elegant, da sehr wohl die Gültigkeit bzw. die Erfüllung von bestimmten Parametern überprüft wird und zugleich eine Zerlegung stattfindet. Reguläre Ausdrücke sind Tokenizern absolut vorzuziehen.

    Je nach verwendeter Engine sind diese nicht nur schneller, sondern verkürzen auch den Code.

    Aber mit den serializierten Objekten stimmt es schon, dass es da eher schwierig wird. Ich würde mir eher etwas einfallen lassen, wo ich vielleicht Objektbeschreibungen hin und hersende, á la XML
    Geändert von Waxolunist (09-10-2006 um 16:36 Uhr)
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  11. #11
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Ich habs aber jetzt mal selbst versucht, und finde, dass es ganz gut funktioniert.

    Hier mal mein Beispiel-Code:

    Code:
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.util.Date;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class StringRegexTest {
    
    	public static void main(String[] args) {
    
    		String serializableObj = SerializeDate.serialize();
    
    		String text = "hpf-net://req=\"run\";object[objname=\"obj1\",obj=\"{"
    				+ serializableObj + "}\"]";
    
    		Pattern pattern = Pattern.compile("^hpf(-net|-db)://.*objname=\"(.*)\",obj=\"\\{([\\u0000-\\uFFFF]*)\\}\".*$", Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
    		Matcher m = pattern.matcher(text);
    		if (m.find()) {
    			//System.out.println(m.groupCount());
    			for (int i = 0; i <= m.groupCount(); i++)				
    				System.out.println(m.group(i));
    		}
    
    		
    	}
    }
    
    class SerializeDate {
    	static String serialize() {
    		try {
    			ByteArrayOutputStream bos = new ByteArrayOutputStream();
    			ObjectOutputStream o = new ObjectOutputStream(bos);
    			o.writeObject("Today");
    			o.writeObject(new Date());
    			o.close();
    			return bos.toString();
    		} catch (IOException e) {
    			System.err.println(e);
    			return null;
    		}
    	}
    }
    Ich habe einfach im serialisierten Teil den Pattern any Character durch any Unicode-Character ersetzt.
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  12. #12
    Registrierter Benutzer
    Registriert seit
    29.09.2006
    Ort
    Helsinki
    Beiträge
    154
    Moin!

    @Waxolunist:
    Sorry, wenn's eigentlich OT ist, aber was studiert ihr Dipl.-Ings. eigentlich? Ich muss nämlich leider anmerken, dass ich "Dipl.-Ing." schon seit einiger Zeit nicht mehr als Qualitätsmerkmal im Informatikbereich akzeptiere, denn relativ häufig musste ich schon feststellen, dass sich hinter Dipl.-Ings., die sich in diesem Bereich versucht haben, ziemlich unfähige Menschen versteckt haben und daher frage ich mich so manches mal, was ein Dipl.-Ing. eigentlich genau studiert...
    Das hat jetzt nichts mit Dir zu tun (ich kenne Dich ja auch überhaupt nicht), ist aber so eine allgemeine Beobachtung, die ich leider in der letzten Zeit machen musste.

    @RegExp's
    Wo findet denn bei der von hpf geschilderten Anwendung die Zerlegung a la Tokenizer statt Irgendwie erinnere ich dunkel, mal gelernt zu haben, dass der Sinn von RegExp's ist, zu prüfen ob ein bestimmter String ein bestimmtes Muster erfüllt und das ganze ist dann ein reines Entscheidungsproblem.
    //EDIT
    Ist aber bei mir hauptsächlich theoretisches Wissen ... Ullman lässt grüßen.

    So long,
    Liberty

    P.S. @Dipl.-Ing.:
    Ich bleibe lieber bei meinem angestrebten "MSc CS"
    Geändert von Liberty (09-10-2006 um 16:38 Uhr)
    Friedliebender Soldat im ganz persönlichen Auslandseinsatz

  13. #13
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Bevor ich mal loslege, möchte ich noch kurz sagen, dass mir der Titel eigentlich wurscht ist, aber er hilft im titelgeilen Österreich. Das möchte ich nicht bestreiten. Mich hat es nur gereizt, dir Konter zu geben auf deine Aussage "... als Informatik-Student...".

    Tja, in Österreich gibts im technischen Bereich noch nicht sehr lange die Aufteilung nach Master und Baccelor. Ich habe also noch nach einem alten Studienplan studiert, stehe aber auf dem Level eines Masters bzw. Magisters der Technik (bäh klingt des grauslich).

    Mein Hauptstudienfach war Nachrichtentechnik mit Schwerpunkt auf Computersimulation.

    Dipl.-Ing. umfasst in Österreich eigentlich jedes technisches Studium, sprich im ersten Abschnitt sind eigentlich alle Ingenieursgrundlagen dran gewesen, das waren Physik 1, Numerik 1, Mathematik 1+2, Informatik 1, Analoge und Digitale Schaltungstechnik und noch einige vorbereitende Vorlesungen für die Speziellen. Im zweiten Abschnitt kommen dann die für das Studienfach spezielleren plus einige Zusatzfächer wie Recht und etwas Wirtschaft, Wissenschaftliches Arbeiten usw.

    Wies jetzt im neuen Studienplan aussieht, kann ich dir nicht genau sagen, aber Kern der Studienreform, war dass man schon früher einen kleinen Abschluss hat, den Bacc eben.

    ad Zerlegung: Du kannst mit Regex sehr wohl splitten. Wenn du meinen Code mal kurz ausführst, siehst du dass der String schon gruppiert ist, und die Gruppen nur mehr der Reihe nach ausgelesen werden müssen. In meinem Beispielcode gebe ich die Strings der Reihe nach auf der Konsole aus.

    /greetz

    Christian
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  14. #14
    Registrierter Benutzer
    Registriert seit
    12.03.2003
    Ort
    Delligsen
    Beiträge
    62
    @Waxolunist
    danke dir nun klappts ^^

  15. #15
    Registrierter Benutzer
    Registriert seit
    29.09.2006
    Ort
    Helsinki
    Beiträge
    154
    Moin,

    @RegExp in Java:
    Ich muss zu meiner Schande eingestehen, dass ich mich mit der Implementierung der RegExp-Mechanismen in Java wegen bisher mangelnder Notwendigkeit noch nicht beschäftigt hatte und daher nicht gewusst habe, dass da auch gleich Tokens mit anfallen, sorry.
    Vom reinen Gefühl her würde ich aber trotzdem weiterhin über einen int64-(oder auch Hex-)Code nachdenken, damit könnten sich Fehler beim Parsen vermeiden lassen (sonst müsstest Du auch sicherstellen, dass in Deinen Object-Strings keine Zeichen auftauchen, die als Trennzeichen zur nächsten Option interpretiert werden könnten.

    @Waxolunist:
    Ich glaube, das Problem bei vielen Dipl.-Ings. ist, dass die von allem ein bißchen gemacht haben und am Ende eher ins mittlere Management gehen müssten und nicht in die rein technische Ebene.
    Klar, wir machen im reinen Informatik-Studium natürlich auch Anteile Mathe (inkl. Statistik) aber wir schenken uns eigentlich diesen physikalischen und juristischen Overhead, den Du jetzt z.B. gemacht hast.
    Kann aber auch ein deutlicher Unterschied FI/AT/DE sein, denn in Deutschland kannst Du Deinen Dipl.-Ing. auch schon an Fachhochschulen machen und musst nicht mal an die Uni.

    So long,
    Liberty
    Friedliebender Soldat im ganz persönlichen Auslandseinsatz

Lesezeichen

Berechtigungen

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