ERLEDIGT
JA
JA
ANTWORTEN
6
6
ZUGRIFFE
420
420
EMPFEHLEN
-
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;
-
22.04.08 16:05 #2
- 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:
[java]System.out.println("Hello World");[/java]Code java:1
System.out.println("Hello World");
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/
-
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
-
-
Ö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
-
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
-
Ähnliche Themen
-
Reguläre Ausdrücke
Von Steusi im Forum PHPAntworten: 3Letzter Beitrag: 13.04.10, 12:44 -
Reguläre Ausdrücke
Von RedShot im Forum PHPAntworten: 1Letzter Beitrag: 21.03.10, 09:24 -
Reguläre Ausdrücke
Von Steusi im Forum Coders TalkAntworten: 4Letzter Beitrag: 11.12.08, 13:01 -
Reguläre Ausdrücke
Von dark-staple im Forum PHPAntworten: 2Letzter Beitrag: 22.05.08, 15:53 -
Reguläre Ausdrücke
Von Fluctuator im Forum PHPAntworten: 4Letzter Beitrag: 03.07.05, 21:54





Zitieren

Login





