tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
420
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    benomatic benomatic ist offline Mitglied
    Registriert seit
    Apr 2008
    Beiträge
    16
    Hallo Leute,

    ich habe endlich das Prinzip von Pattern und Matchern in Java verstanden trotzdem vermisse ich einige "feature" die ich von Perl her kenne.

    Mein Problem ist folgendes:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    Pattern p1 = Pattern.compile("ab \\d\\d:\\d\\d");
    URLConnection con = new URL(url).openConnection();
    BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            while (br.ready()) {
                tmp = br.readLine();
                if (p1.matcher(tmp).find()) { // Pattermatching
                    System.out.println(tmp);
                }
            }
            br.close();

    Ausgabe ist dies:
    Code :
    1
    2
    3
    
    <td class="color3" headers="aban1">ab 14:00</td>
    <td class="color3" headers="aban1">ab 14:06</td>
    <td class="color3" headers="aban1">ab 14:07</td>

    Gibt es die Möglichkeit nach "ab \d\d:\d\d" zu suchen um dann wiederum
    an die "stunden" und "Minuten" zukommen als int.

    Wäre sehr cool wenn mir einer nen Tip geben könnte wie ich nach einem SubString im String suchen und ausgeben kann, ohne die gesamte Zeile.

    Ich glaube der Perl code wäre sowas:
    Code :
    1
    2
    
    $string =~m/regexp/$1/g;
    $subString = $1;
     

  2. #2
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Also für Zeitangaben gibt es die Klasse SimpleDateFormat, um diese zu parsen.

    (nicht Zeitpaterns müssen mit einem ' escaped werden)

    http://java.sun.com/javase/6/docs/api/index.html

    Aber das könnte beinahe schon mit Kanonen auf Spatzen zu schießen bedeuten
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  3. #3
    Avatar von takidoso
    takidoso takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    911
    Zitat Zitat von benomatic Beitrag anzeigen
    Hallo Leute,

    Ausgabe ist dies:
    Code :
    1
    2
    3
    
    <td class="color3" headers="aban1">ab 14:00</td>
    <td class="color3" headers="aban1">ab 14:06</td>
    <td class="color3" headers="aban1">ab 14:07</td>

    Gibt es die Möglichkeit nach "ab \d\d:\d\d" zu suchen um dann wiederum
    an die "stunden" und "Minuten" zukommen als int.

    [/CODE]
    Wenn ich Dich richtig verstehe möchtest Du aus "<td class="color3" headers="aban1">ab 14:00</td>" die Stunden und Minuten haben..
    Wenn ich Dein Programmcode richtig verstehe hast Du da so eine Art grep programiert (hole mal die Zeile die einem bestimmten Muster entspricht..)
    Also eine Möglichkeit wäre, wenn man weiß dass die zu untersuchenden Zeilen alle homogen sind, einfach mit dem Offset der gewünschten Zeichenkette zu arbeiten und mit enem Substring zu arbeiten. Da aber die Welt nicht immer so statisch ist habe ich da eine Kanone für Dich, die auch Deinen Spatz abschießen könnte :-D

    Da habe ich doch glatt eine Klasse die Dir vielleicht weiterhefen könnte...
    Ich nenne sie StringComposer, Mit der kannst Du einen String zerlegen und so ziemlich jeden beliebigen String konstruieren, inklusive sequenziellen Nummernr, TimeStamps und wenn Du magst auch Properties. Als Eingangsinformation dienen unter anderem ein Eingangsmuster (RegEx) der Quell-String und ein Ausgangsmuster, welches eine eigene Syntax hat, di eaber relativ leicht zu lernen ist. Das Ausgangmuster kann bei Bedarf die potenziell im Eingangsmuster verwendeten Gruppen in den neuen String einbeziehen.

    Für Dein Beispiel wäre es vermutlich wie folgt
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    String inputStr         = geleseneZeile;
    String inputMuster   = "<td.*>ab (\\d{2}):(\\d{2})</td>";  //Gruppe 1= Stunden Gruppe 2 = Minuten
    String outputMuster = "(1)";
    StringComposer strComp = new StringComposer(new Map()  // nur als Dummy
                                                                            inputMuster ,
                                                                            inputStr,
                                                                            outputPattern);
    String stunden = strComp.constructString();
    outputMuster   = (2);
    strComp          = new StringComposer(new Map()  // nur als Dummy
                                                             inputMuster ,
                                                             inputStr,
                                                             outputPattern);
    String minuten = strComp.constructString();

    Im Anhang sind die notwendigen Klassen als .txt musst dann natürlich noch die Paketangabe nach Deinem Wohldünken angeben. (mach damit was Du magst, verübe aber keinen terroristischen Anschlag

    viel Spaß damit

    Takidoso
    Angehängte Dateien Angehängte Dateien
     

  4. #4
    benomatic benomatic ist offline Mitglied
    Registriert seit
    Apr 2008
    Beiträge
    16
    Zitat Zitat von takidoso Beitrag anzeigen
    mach damit was Du magst, verübe aber keinen terroristischen Anschlag
    ich werde mich zurückhalten

    Super werde ich mir anschauen aber das wird mir bestimmt noch in zukunft weiterhelfen, vielen Dank
     

  5. #5
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Öhm wenn ich das richtig verstanden habe reicht doch folgendes völlig:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    public static void main(String[] args) {
        final String search = "<td class=\"color3\" headers=\"aban1\">ab 14:00</td>";
        final String regExp = "ab (\\d\\d):(\\d\\d)";
        
        Pattern p = Pattern.compile(regExp);
        final Matcher matcher = p.matcher(search);
        
        if(matcher.find()){
            String hours = matcher.group(1);
            String minutes = matcher.group(2);
            System.out.println(hours + " " + minutes);
        }
        else{
            System.out.println("String not found");
        }
    }

    Ausgabe:
    Code :
    1
    
    14 00
     

  6. #6
    Avatar von takidoso
    takidoso takidoso ist offline Mitglied Brillant
    Registriert seit
    Aug 2004
    Ort
    Kömigstein
    Beiträge
    911
    Hi Zeja,
    ja Du hast recht, Deine Lösung ist die direktere und für dieses Problem betreffend möglicherweies auch die angebrachtere.
    Aber ich wollte doch nur (ganz stolz) die Kanone für den Spatz bieten .
    Die Klasse ist gut, sobald es darum geht Strings neu zusammenzubasteln, sei es aus persistenten, laufenden Nummern beliebigen Formats, TimeStamps beliebigem Formats, anderen festen Stringbestandteilen, Properties (voreingestellt sind Systemproperties), oder (und) Bestandteilen eines Eingangsstrings.
    Ursprünglich hatte ich den StingComposer wegen Dateiumbenennungen gebaut und vielleicht hat ja jemand irgendwann ähnliche Bedürfnisse.

    Der momentane Zustand mit den "home-brewed" AutoCountern ist vielleicht etwas plump. Man würde hier vielleicht hin und wieder lieber auf einen Zähler einer Datenbank zurückgreifen wollen. Empfehlenswert wäre daher bei einer Erweiterung des Ganzen ein sinniges Interface zwischen "AutoCounter" und "StringComposer" zu etablieren, damit dann auch beispielsweise Oracle-Sequences zum Einsatz kommen könnten. Das überlasse ich aber gerne jedem selbst.
    Geändert von takidoso (23.04.08 um 12:51 Uhr) Grund: Nachtrag
     

  7. #7
    benomatic benomatic ist offline Mitglied
    Registriert seit
    Apr 2008
    Beiträge
    16
    Zitat Zitat von zeja Beitrag anzeigen
    Öhm wenn ich das richtig verstanden habe reicht doch folgendes völlig
    Super, jetzt weis ich endlich wie das mit der rückreferenz klappt, das das hier group heist
    und das man so drauf zugreift war mir nicht bekannt, nochmals vielen vielen Dank.
    Jetzt klappt auch alles so wie ich mir das vorstelle.
     

Ähnliche Themen

  1. Reguläre Ausdrücke
    Von Steusi im Forum PHP
    Antworten: 3
    Letzter Beitrag: 13.04.10, 12:44
  2. Reguläre Ausdrücke
    Von RedShot im Forum PHP
    Antworten: 1
    Letzter Beitrag: 21.03.10, 09:24
  3. Reguläre Ausdrücke
    Von Steusi im Forum Coders Talk
    Antworten: 4
    Letzter Beitrag: 11.12.08, 13:01
  4. Reguläre Ausdrücke
    Von dark-staple im Forum PHP
    Antworten: 2
    Letzter Beitrag: 22.05.08, 15:53
  5. Reguläre Ausdrücke
    Von Fluctuator im Forum PHP
    Antworten: 4
    Letzter Beitrag: 03.07.05, 21:54