innerhalb eines Strings mit RegEx matchen

Status
Nicht offen für weitere Antworten.
K

Katjushka

Gast
hallo, leute. Ich habe folgende Hausaufgabe: ich muss auf eine Webseite gehen, da einen Link auf das Impressum finden und dem Link folgen (keine Angst: bin keine Spam-Verteilerin :D ) Nun habe ich die Seite durchgescannt und tokeniziert. Nach einem RegEx
Code:
".*[Ii]mpressum.*"
hat die folgende Zeile gematcht
href="./impressum.html"><img
.
Jetzt möchte ich natürlich das "impressum.html" aus dieser Zeile extrahieren. Gibt es denn eine Möglichkeit innerhalb eines Strings zu matchen und das gematchte gleich in einer Variable zu speichern? Ich weigere mich an dieser Stelle den String einfach weiter nach " oder einem sonstigen Zeichen zu splitten, weil ich nicht weiß, was alles für Quellcode im Netz zu finden ist, kann ja sein, dass es nirgendwo sonst dann passen wird.
Danke
 

mephi

Bekanntes Mitglied
setze das was du brauchst in runde klammern
die methode in java für die klasse Matcher müsste dann group() sein..
ohne parameter bekommst du alles was er findet und mit parameter bekommst du die subpattern. group(1) liefert dir das erste subpattern, sprich alles von der ersten öffnenden klammer bis zu ihrer schließenden klammer.
 
K

Katjushka

Gast
Nach dieser Antwort sehe ich, dass ich mich nicht ganz gut ausgedruckt hab. Was habe ich und was ich haben will:
Vorhandender String
href="./impressum.html"><img
Was ich haben will:
Ich will nichts gruppieren.
PROBLEM: Ich habe 100 URLs. Jetzt habe ich nur eine genommen, wo es eben so aussieht wie oben. Wenn ich den String oben nach beispielsweise " splitte und den "." entferne, werde ich zwar in diesem Fall das richtige Ergebnis haben, aber man kann nicht garantieren, dass der String in einer anderen URL nicht ganz anders aussieht.

@mephi: ich habe schon mit folgendem Code versucht, klappt aber nicht aus wahrscheinlich o.g. Gründen:
Code:
 String regex = "([A-Za-z0-9]*[.-_]*[A-Za-z0-9]*[.-_]*impressum[A-Za-z0-9]*[.-_]*[A-Za-z0-9]*.[a-z]*)";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(url);
        try
        {
        System.out.println(matcher.group());
        }
        catch (Exception ex){
            System.out.println("not found");
        }
 

madboy

Top Contributor
Was mephi gemeint hat (unterstelle es ihm/ihr mal :wink: ) ist

Code:
String regex = ".*([Ii]mpressum\\.html).*";
Zugriff mit
Code:
matcher.group(1)

man kann nicht garantieren, dass der String in einer anderen URL nicht ganz anders aussieht.
Vorschlag:
Code:
String regex = "href=\"([^\"]+)\">";
matcher.group(1);
Nicht schön, auch nicht getestet aber in die Richtung sollte es funktionieren, Links aus der Seite zu holen, so lange ein "href" davor steht.

Gruß,
madboy
 

kleiner_held

Top Contributor
Anzumerken wäre noch, dass sich das group() natuerlich auf ein vorheriges find()/matches()/lookingAt() bezieht.
Also zB:
Code:
while (matcher.find())
{
    System.out.println(matcher.group(1));
}
 
K

Katjushka

Gast
Meinst du, es ist sinnvoll davon auszugehen, dass es immer so aussieht und einfach alles bis zum Schrägstrich löschen lassen und nach dem ".html" bzw. ".php"
 

madboy

Top Contributor
Hmmm. Ob das sinnvoll ist weiß ich nicht, das musst du entscheiden bzw. der Aufgabensteller.

So weit ich informiert bin sehen Hyperlinks in HTML immer so aus dass
Code:
...href="seite"...
da steht.

Sollte es anders aussehen ist es halt kein (standardkonformes) HTML mehr

Gruß,
madboy

EDIT: Welcher Schrägstrich? Das \" ist nur ein Anführungszeichen. Der Schrägstrich davor ist nur zum escapen da.
 
K

Katjushka

Gast
In einem anderen Forum wurde mir empfohlen erst einen HTML Parser über die Seite laufen zu lassen und dann mit dem Matchen anfangen. Was denkt ihr dazu? Wird dann nicht auch alles zwischen < und > auch noch gelöscht?
 

mephi

Bekanntes Mitglied
wenn du einen guten regex schreibst brauchst du das eigentlich nicht..

naja crossposting, spam-verteilerin.. du machst dich beliebt *g*
 

madboy

Top Contributor
Katjushka, mir kommt es so vor, als wüsstest du nicht genau was du überhaupt machen willst.
Der erste Schritt sollte sein, dir klarzumachen was GENAU du finden willst:

1) Alle Links in einem Dokument oder
2) alle Links die "impressum.html" heißen oder
3) alle Links, die "impressum.*" heißen oder
4) alle Links, die "[Ii]mpressum.*" heißen oder
5) genau einen Link, der "blablubb.php" heißt oder
6) alles was an einer bestimmten Position im Dokument steht oder
...

Meistens werden mehrere Lösungen zum Ziel führen. Welche davon sinnvoll ist, kann dir niemand sagen, der nicht die GENAUE Aufgabenstellung kennt und wie viel Zeit/Ressourcen du investieren willst.

Ansonsten kann ich mich mephi nur anschließen.

Gruß,
madboy
 
K

Katjushka

Gast
Mein Algorithmus im Pseudocode wäre.

Code:
String regex = "blabla"; //hier wäre die RegEx die erstmal nicht so wichtig ist
String ursprungszeile ="href =blabla"; //die Zeile, die schon vorhanden ist
String aktuelleurl="";

if(regex KOMMTVORIN ursprungszeile){

SPEICHERE DAS GEMATCHTE IN EINER VARIABLE aktuelleurl;}

das heisst, wenn der Regex "\w*(impressum)\.(html)" ist (ist jetzt nur das vereinfachte Beispiel),
sieht die ursprungszeile aus:
href=./unternehmenimpressum.html
möchte ich bekommen
aktuelleurl="unternehmenimpressum.html"

Problem: wie schreibt man: KOMMTVORIN und SPEICHERE DAS GEMATCHTE (eben nicht den regex) IN EINER VARIABLE?

Hoffentlich ist es jetzt klar, was ich meine
 

madboy

Top Contributor
Code:
String regex = "\w*(impressum)\.(html)"; //hier wäre die RegEx die erstmal nicht so wichtig ist 
String ursprungszeile ="href =blabla"; //die Zeile, die schon vorhanden ist 
String aktuelleurl=""; 

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(ursprungszeile);

if (matcher.find()) { //if(regex KOMMTVORIN ursprungszeile)
//Ersetze "if" durch "while" und "String aktuelleurl" durch ein Array o.ä. wenn du alle gefundenen Muster willst

    aktuelleurl = matcher.group(1) + matcher.group(2);  //SPEICHERE DAS GEMATCHTE IN EINER VARIABLE aktuelleurl
}
 
K

Katjushka

Gast
Danke :D , jetzt sieht es ähnlich aus zu dem, was ich mir vorgestellt hätte. Muss noch zu Hause ausprobieren.
 
K

Katjushka

Gast
ja, danke, bloss der "1" hat mich verwirrt, ich habs nicht kapiert, dass es ein Integer genau so drin stehen soll und hab versucht mit group(regex); (hab mir gedacht 1 steht für ein Argument), was gar nicht gegangen ist. Es bleibt mir immer noch ein Rätzel, was dieser 1 sein soll.
Ausserdem klappt bei mir auch die Zuweisung der Art schon nicht:

String regex = "href=\"([^\"]+)\">";

Da zeigt mir NetBeans immer Fehler an und schlägt vor, einen ";" einzufügen.
 

madboy

Top Contributor
Code:
String regex = "href=\"([^\"]+)\">";
ist korrekt, zumindest sagt javac nix Gegenteiliges :wink:
Schau mal in der Zeile davor, ob da ein Semikolon steht.

Es bleibt mir immer noch ein Rätzel, was dieser 1 sein soll.
1 ist die Nummer der group. Alles was innerhalb einer Klammer steht, gehört zu einer group.
Code:
String regex = "...(group1)(group2)..."

http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html#group(int)
 

mephi

Bekanntes Mitglied
Katjushka hat gesagt.:
ja, danke, bloss der "1" hat mich verwirrt, ich habs nicht kapiert, dass es ein Integer genau so drin stehen soll und hab versucht mit group(regex); (hab mir gedacht 1 steht für ein Argument), was gar nicht gegangen ist. Es bleibt mir immer noch ein Rätzel, was dieser 1 sein soll.

mephi hat gesagt.:
ohne parameter bekommst du alles was er findet und mit parameter bekommst du die subpattern. group(1) liefert dir das erste subpattern, sprich alles von der ersten öffnenden klammer bis zu ihrer schließenden klammer.
 
K

Katjushka

Gast
Es hat geklappt. Danke an alle :D . Das Problem eines Newbies ist ja, dass er/sie die Antworten auf eigene Fragen nicht versteht :wink:
Hab auch herausgefunden, was in meinem RegEx schiff war, man soll
Code:
\\.
statt
Code:
\.
schreiben (im Gegensatz zum beispielsweise Perl), wenn man einen Punkt als normales Zeichen verwenden will.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Innerhalb eines Strings nach einem Teilstring suchen Java Basics - Anfänger-Themen 2
J Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String Java Basics - Anfänger-Themen 12
Z Erste Schritte Indexe innerhalb eines Arrays zusammensählen Java Basics - Anfänger-Themen 14
M Auf einen Array innerhalb eines Objekts zugreifen Java Basics - Anfänger-Themen 5
dapzoo Innerhalb eines Jahres intensivem Java-Selbststudium zur Anstellung? Java Basics - Anfänger-Themen 37
S Wert innerhalb eines anderen Wertes Java Basics - Anfänger-Themen 3
I Try-Catch innerhalb eines Catchblocks Java Basics - Anfänger-Themen 1
Silvascus Erste Schritte Werte innerhalb eines Arrays addieren Java Basics - Anfänger-Themen 3
L Punkt innerhalb eines Bereiches verschieben Java Basics - Anfänger-Themen 9
S Classpath: Alle .jars innerhalb eines Ordners einbinden Java Basics - Anfänger-Themen 4
T Erste Schritte run innerhalb eines package Java Basics - Anfänger-Themen 1
D Methoden Implementieren von einer Zoomfunktion innerhalb eines JPanels mit null-Layoutmanager Java Basics - Anfänger-Themen 1
M Throws Anweisung innerhalb eines Methodenkopfes unklar Java Basics - Anfänger-Themen 4
M Variablen Zugriff von außerhalb eines Blockes auf eine Variable innerhalb eines Blockes Java Basics - Anfänger-Themen 2
O Files eines Directories innerhalb eines JAR-Files auflisten Java Basics - Anfänger-Themen 0
I JTextfield[] innerhalb eines Itemlistener aufrufen Java Basics - Anfänger-Themen 2
B Zufallsdatum innerhalb eines bestimmten Bereiches erzeugen Java Basics - Anfänger-Themen 3
D OOP Identifzierung eines Objektes innerhalb eines Array Java Basics - Anfänger-Themen 3
G Bewegung innerhalb eines Koordinatensystems berechnen Java Basics - Anfänger-Themen 9
H Innerhalb eines Package wird eine Klassenmethode nicht gefunden. Java Basics - Anfänger-Themen 2
Kaniee Zugriffe innerhalb eines Arrays Java Basics - Anfänger-Themen 9
K Zufällige Auswahl innerhalb eines Arrays und Arrays aus JLabel füllen Java Basics - Anfänger-Themen 32
K Bild mit Maus innerhalb eines Rahmens bewegen Java Basics - Anfänger-Themen 5
S Variablen Variable innerhalb eines if-Statements? Java Basics - Anfänger-Themen 10
S Innerhalb eines Fensters ein neues erschaffen Java Basics - Anfänger-Themen 7
E Elemente innerhalb eines Arrays vergleichen Java Basics - Anfänger-Themen 7
radiac Datentypen RANDOM-punkt setzen INNERHALB eines BEREICHes Java Basics - Anfänger-Themen 2
L Timer innerhalb eines Threads Java Basics - Anfänger-Themen 3
C Textausgabe auf Panelen innerhalb eines Applets Java Basics - Anfänger-Themen 6
N aus .txt innerhalb eines JARs Zeilenweise lesen Java Basics - Anfänger-Themen 8
F Verwenden von Input innerhalb eines Applets Java Basics - Anfänger-Themen 3
T Auf Objekte innerhalb eines Panels zugreifen Java Basics - Anfänger-Themen 9
H WinHelp innerhalb eines laufenden JavaProgrammes öffnen Java Basics - Anfänger-Themen 15
G properties-Datei innerhalb eines package auslesen Java Basics - Anfänger-Themen 3
G Auf File / Verzeichnis innerhalb eines jars zugreifen Java Basics - Anfänger-Themen 2
S Summe innerhalb eines arrays? Java Basics - Anfänger-Themen 2
F config.xml innerhalb eines Servlets laden Java Basics - Anfänger-Themen 4
M Felder innerhalb eines Arrays vergleichen Java Basics - Anfänger-Themen 2
A Innerhalb eines ActionEvents Eingaben tätigen Java Basics - Anfänger-Themen 23
I Viereck / Rechteck Prüfung innerhalb einem bestimmten Bereich Java Basics - Anfänger-Themen 2
I Innerhalb einem Bild ein Teil austauschen Java Basics - Anfänger-Themen 26
F wie kann ich die Position des letzten Vokals innerhalb einer Zeichenkette ermitteln? Java Basics - Anfänger-Themen 5
J int innerhalb einer Datei ändern Java Basics - Anfänger-Themen 1
J if-Schleife innerhalb einer if-Schleife wird in der Konsole nicht gelesen Java Basics - Anfänger-Themen 4
I Variable innerhalb Methode: Local variable test defined in an enclosing scope must be final or effectively final Java Basics - Anfänger-Themen 3
I ArrayList erstellen innerhalb einer Zeile? Java Basics - Anfänger-Themen 3
B Summe von Property innerhalb einer Liste via Lambda Java Basics - Anfänger-Themen 1
B Enum innerhalb einer Klasse / anderes Konzept Java Basics - Anfänger-Themen 8
T split innerhalb Klammern ignorieren? Java Basics - Anfänger-Themen 6
x-tshainge Innerhalb von Textdatei addieren Java Basics - Anfänger-Themen 9
J Innerhalb von Zeichenketten tauschen Java Basics - Anfänger-Themen 1
S BufferedWriter innerhalb einer Methode Java Basics - Anfänger-Themen 2
H Innerhalb einer Methode eine Variable der aufrufenden Methode ändern? Java Basics - Anfänger-Themen 2
H For-Schleife innerhalb If-Abfrage? Java Basics - Anfänger-Themen 3
A Werte innerhalb von resultset vergleichen Java Basics - Anfänger-Themen 2
B Key auslesen/ausgeben innerhalb von foreach() Java Basics - Anfänger-Themen 5
MiMa abbruch innerhalb einer Rekursiven Schleife Java Basics - Anfänger-Themen 5
J Array innerhalb einer Funktion mehrfach iniatilisieren Java Basics - Anfänger-Themen 4
O Vererbung this innerhalb von super Java Basics - Anfänger-Themen 7
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
I Innerhalb einer Methode suchen und hinzufügen. Neues Objekt in Suche dann? Java Basics - Anfänger-Themen 8
M Farben/Color Abfragen von Farben innerhalb einer Methode Java Basics - Anfänger-Themen 9
I Rückgabe und Aufruf einer Methode innerhalb einer anderen Methode Java Basics - Anfänger-Themen 5
B Variablen global abspeicher innerhalb von Methoden Java Basics - Anfänger-Themen 7
M Text innerhalb Anführungsstriche als "eins" auswerten Java Basics - Anfänger-Themen 5
S Funktionen/Atrribute nur innerhalb einer package Zugänglich machen Java Basics - Anfänger-Themen 8
P Kapselung Variable innerhalb einer inneren Klasse ansprechen ohne ein Objekt erzeugen zu müssen? Java Basics - Anfänger-Themen 6
L Next()-Aufruf zweimal innerhalb einer While-Schleife bei ListIterator Java Basics - Anfänger-Themen 10
W Methodenaufruf innerhalb einer Klasse - static vs. this Java Basics - Anfänger-Themen 3
B for-schleife innerhalb neuer Methode Java Basics - Anfänger-Themen 5
N Innerhalb des Programmes RAM einstellen Java Basics - Anfänger-Themen 2
J Variablen überschreiben innerhalb einer Klasse Java Basics - Anfänger-Themen 7
N Zugriff auf Werte in Arrays innerhalb ArrayList Java Basics - Anfänger-Themen 2
A Zugriff auf Komponente innerhalb einer JPanel Java Basics - Anfänger-Themen 8
A objekt innerhalb der gleiche klasse Java Basics - Anfänger-Themen 10
J Dateien innerhalb einer JAR verwenden Java Basics - Anfänger-Themen 3
J Innerhalb der Border zeichnen Java Basics - Anfänger-Themen 9
P Unterschied JRE innerhalb/ außerhalb des JDK Verzeichnisses? Java Basics - Anfänger-Themen 5
S Input/Output Problem mit dateizugriff innerhalb der .jar (Applet) Java Basics - Anfänger-Themen 2
E Zeile innerhalb Datei überschreiben Java Basics - Anfänger-Themen 2
K Methoden Zustand innerhalb einer Instanz ändern Java Basics - Anfänger-Themen 2
M Java-Prog soll Texte innerhalb Bildern erkennen Java Basics - Anfänger-Themen 2
N OOP Zugriff auf eine Objekt innerhalb einer Klasse aus statischen Methoden Java Basics - Anfänger-Themen 9
M Main methode innerhalb von Java aufrufen Java Basics - Anfänger-Themen 11
A lokale Variable innerhalb "actionPerformed()" Java Basics - Anfänger-Themen 10
L Lokale Variable und Instanzvariable innerhalb Iterator Java Basics - Anfänger-Themen 8
M FileWriter innerhalb runnable Jar Java Basics - Anfänger-Themen 8
J Diverse Frag zu Vererbung innerhalb von Java Java Basics - Anfänger-Themen 6
O Änderungen innerhalb for-Schleife speichern Java Basics - Anfänger-Themen 17
J Wie auf eine Datei innerhalb des JAR-Files zugreifen Java Basics - Anfänger-Themen 2
T switchcase innerhalb Schleife: von case-Fall aus Schleife beenden Java Basics - Anfänger-Themen 3
H Klassen zur Anzeige ines Bildes und zum Zeichnen innerhalb diese Bildes Java Basics - Anfänger-Themen 2
D Datei innerhalb einer zip bearbeiten Java Basics - Anfänger-Themen 8
D .class-Datei innerhalb einer .jar-Datei verändern Java Basics - Anfänger-Themen 4
R Interface innerhalb einer Klasse definieren..? Java Basics - Anfänger-Themen 2
M Methode innerhalb Methode Java Basics - Anfänger-Themen 10
C Variable Zeichenkette innerhalb einer Schleife ersetzen Java Basics - Anfänger-Themen 4
Das Brot Relative Pfadangaben innerhalb von .jar Archiven Java Basics - Anfänger-Themen 7
Screen Mouserobot clonen? Zeiger nur innerhalb eins Fensters? Java Basics - Anfänger-Themen 3
E Boolean wert innerhalb einer Tabelle ändern Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben