PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : java regexp



Kratz00
16-05-2003, 21:17
will so ne art proxy bauen
der browser schickt den reqest jetzt an den proxy und ich hab dann folgenden bsp string

GET http://www.heise.de/newsticker HTTP/1.1 Host: www.heise.de User-Agent: Links (0.98; Linux 2.4.20 i686; 80x24) Accept: */* Accept-Charset: us-ascii, ISO-8859-1, ISO-8859-2, ISO-8859-4, ISO-8895-5, ISO-88 59-7, ISO-8895-9, ISO-8859-13, ISO-8859-15, ISO-8859-16, windows-1250, windows-1 251, windows-1257, cp437, cp737, cp850, cp852, cp866, x-cp866-u, x-mac, x-mac-ce , x-kam-cs, koi8-r, koi8-u, TCVN-5712, VISCII, utf-8 Proxy-Connection: Keep-Alive
jetzt will ich irgendwie das was hinter
Host: steht zurück kriegen um dann einen socket zu dem webserver aufmachen zu können,
wie stell ich das am besten an mit java oder wäre es hier sinnvoll
auf das gute alte perl zurück zugreifen

peschmae
17-05-2003, 08:44
ab java 1.4 gibts eine regexp - api, für vorher musst du das mit "String.indexOf()" (leider nur case-dependent) zu lösen versuchen

für die Regexp - Api etwa so (compiliertes Pattern kann wiederverwendet werden, ungetestet)


import java.util.regex.*;

Pattern p = Pattern.compile("host:(.*)User-Agent");
String s = p.matcher("GET http://www.heise.de/newsticker HTTP/1.1 Host: www.heise.de User-Agent: Links (0.98; Linux 2.4.20 i686; 80x24) Accept: */* Accept-Charset: us-ascii, ISO-8859-1, ISO-8859-2, ISO-8859-4, ISO-8895-5, ISO-88 59-7, ISO-8895-9, ISO-8859-13, ISO-8859-15, ISO-8859-16, windows-1250, windows-1 251, windows-1257, cp437, cp737, cp850, cp852, cp866, x-cp866-u, x-mac, x-mac-ce , x-kam-cs, koi8-r, koi8-u, TCVN-5712, VISCII, utf-8 Proxy-Connection: Keep-Alive");


MfG Peschmä

Kratz00
17-05-2003, 12:57
nur leider ist der return wert der matcher methode nicht vom typ String
ich muss das irgendwie anders machen
danke für deine hilfe

arthur
17-05-2003, 13:22
versuch es mal so:



String in = "yyyyyyyyyyy Host: www.abc.de yyyyyyyyyyyy";
Pattern p = Pattern.compile(".*Host: *([^ ]*).*");
Matcher m = p.matcher(in);
if (m.find()==true)
System.out.println(in.substring(m.start(1),m.end(1 )));


gruss
Arthur

Kratz00
17-05-2003, 13:34
vielen dank arthur, das funktioniert zu 100% !
java und regexp find ich zurzeit noch recht komisch, mal sehen ob wir noch freunde werden :)
da lob ich mir doch sed oder perl

peschmae
17-05-2003, 19:01
da ist wohl was auf dem Weg von Kopf zum Forum verloren gegangen (hattes nämlich noch extra nachgeschaut) :p

sollte so heissen:


import java.util.regex.*;

Pattern p = Pattern.compile("host.*)User-Agent");
Strings = p.matcher("GET http://www.heise.de/newsticker HTTP/1.1 Host: www.heise.de User-Agent: Links (0.98; Linux 2.4.20 i686; 80x24) Accept: */* Accept-Charset: us-ascii, ISO-8859-1, ISO-8859-2, ISO-8859-4, ISO-8895-5, ISO-88 59-7, ISO-8895-9, ISO-8859-13, ISO-8859-15, ISO-8859-16, windows-1250, windows-1 251, windows-1257, cp437, cp737, cp850, cp852, cp866, x-cp866-u, x-mac, x-mac-ce , x-kam-cs, koi8-r, koi8-u, TCVN-5712, VISCII, utf-8 Proxy-Connection: Keep-Alive").group(1);

vielleicht auch .group(0) (ausprobieren ;-))

d.h. bei Arthurs Code kannst du die letzten drei Zeilen durch


System.out.println(p.matcher(in).group(1));

ersetzen.

MfG Peschmä

P.S. @arthur: Wieso eigentlich (...==true), das Zeugs ist doch schon boolean, da
P.S. 2 da ich GCJ auch verwende, habe ich bisher auf die Regexp - API verzichtet

arthur
17-05-2003, 20:10
@peschmae:
1)einfach nur der lesbarkeit wegen (kommt bei mir von c++ coden)
2)die von dir vorgeschlagene änderung funktioniert aber so nicht.

(das mit group habe ich übersehen :rolleyes: )
deswegen hier noch die gekürzte form:


if (m.find())
System.out.println(m.group(1));


gruss
Arthur

peschmae
18-05-2003, 08:38
okok, das find muss noch hin, das hatte ich übersehen... :D

MfG Peschmä