Frage zu Pattern/Matcher

ttttttt

Mitglied
Hallo liebe Community,
heute habe ich mich ein wenig auf Basis des hilfreichen FAQs
Grundzüge von Pattern-Matching und Split mit Pattern-Mathing beschäftigt.
Einige Probleme konnte ich dabei aber noch nicht eigenhändig lösen.

Grundlegend möchte ich ein Programm schreiben, das in der Lage ist, die Grafikadressen von Bildern einer Seite aus dem Seitenquelltext der jeweiligen Seite heraus zu lesen. Exemplarisch:

Das Bild mit der Adresse http://www.all-art.org/Visual%20History/modern%20era/mucha/28.jpg wird im Quelltext der dazugehörigen Seite (derjenigen Seite, in die es eingebettet ist) wie folgt erwähnt:
HTML:
<img border="1" src="../Visual%20History/modern%20era/mucha/28.jpg" width="566" height="800"><br>

Diesen Code möchte ich nicht komplett erhalten, sondern nur den Teil ab http:// ODER .. bis jpg. Hier also:
HTML:
../Visual%20History/modern%20era/mucha/28.jpg

Damit stellt sich die Frage:
Verwende ich mit
Java:
String regex = "(http://|\\.\\.).*(jpg)";
die richtige Zeichenreihenfolge für's Pattern-Matching? Ich fürchte nämlich, die Sache mit dem Maskierungs-\ hab' ich noch nicht richtig raus ...

Zweitens: Ich habe versucht eine Methode compare zu schreiben, die das Pattern-Matching durchführt. Diese Methode ist in eine while-Schleife eingebaut.
Ich hätte gerne, dass ich somit alle passenden Grafikadresse (hier zbsp: ../Visual%20History/modern%20era/mucha/28.jpg) als String in einem Array oder einer ArrayList speichern kann.
Wie mache ich das? Denn die Methode gibt doch nur ein boolean zurück, nicht aber die Adresse ...
Hier Auszüge aus dem Code:

Java:
	public static boolean compare(String regex, CharSequence input ) 
	{ 
	 Pattern p = Pattern.compile(regex); 
	 Matcher m = p.matcher( input ); 
	 return m.matches();
	 //gibt boolean zurück, es sollten aber auch die passenden Codeteile (also die BilderURL)
	 //als String zurück gegeben werden. Wie funktioniert das?
	}

Auszug aus der main:

Java:
	      String line;
	      String regex = "(http://|\\.\\.).*(jpg)";
	            
	          //liest so viele Zeilen aus wie vorhanden
	          while ((line = in.readLine()) != null)
                          //führt für jede Zeile compare durch
	        	  compare(regex, line)
 

eRaaaa

Top Contributor
Also ich würde es mit [c]"<img .* src=\"(.+\\.jpg).*"[/c] mal versuchen, wobei das vermutlich auch nicht optimal ist.Es gibt ja nicht umsonst HTML-Parser etc. wieso benutzt du nicht einfach schon etwas fertiges ?
Zu deiner zweiten Fragen, nunja, entweder diese Methode fügt den String/URL direkt in die Liste ein, sie gibt nur den String zurück(oder eben null wenn nichts gefunden wurde, das kannst du ja abfragen) oder ein Holder(boolean + String)

Java:
	public static void main(String[] args) throws Exception {
		String s = "<img border=\"1\" src=\"../Visual%20History/modern%20era/mucha/28.jpg\" width=\"566\" height=\"800\"><br>";
		System.out.println(compare("<img .* src=\"(.+\\.jpg).*", s)); //../Visual%20History/modern%20era/mucha/28.jpg
	}

	public static String compare(String regex, CharSequence input) {
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(input);
		if(m.find()){
			return m.group(1);
		}
		return null;
	}

:oops:
 

Mizar

Aktives Mitglied
Ich würde das ganze so machen:
Java:
public class Main
{
	public static void main(String[] args)
	{
		String data = "";
		try {
			InputStream is = new URL("http://www.java-forum.org/java-basics-anfaenger-themen/111960-frage-pattern-matcher.html").openStream();
			Scanner scanner = new Scanner(is);
			data = scanner.useDelimiter("\\Z").next();
			scanner.close();
			is.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
		Pattern pattern = Pattern.compile("<img(?:\"[^\"]*\"|'[^']*'|[^\"'>])*src=(\"[^\"]+\"|'[^']+')(?:\"[^\"]*\"|'[^']*'|[^\"'>])*/?\\s*>");
		Matcher matcher = pattern.matcher(data);
		while(matcher.find()) {
            // Hier die Treffer dann einem Array, Liste oder was auch immer hinzufügen
            // Als Test nur eine Konsolenausgabe:
			System.out.println(matcher.group(1));
		}
	}
}
Der RegEx wäre also (mit Escapesequenzen):
Code:
<img(?:\"[^\"]*\"|'[^']*'|[^\"'>])*src=(\"[^\"]+\"|'[^']+')(?:\"[^\"]*\"|'[^']*'|[^\"'>])*/?\\s*>
Wie du vielleicht siehst, habe ich den Code zu Testzwecken gleich mal auf diesen Thread hier losgelassen und es ergaben sich die folgenden Treffer zum Zeitpunkt meines Postings(gekürzt):
Code:
"http://www.java-forum.org/images/misc/java_forum_org.gif"
"http://www.buecherbillig.de/images/82661797s.jpg"
"http://www.java-forum.org/images/misc/navbits_start.gif"
"http://www.java-forum.org/iconimages/java-basics-anfaenger-themen/frage-pattern-matcher_ltr.gif"
und einige mehr...
Ich hoffe die dabei mit enthaltenen Anführungszeichen stören nicht all zu sehr, dafür ist der RegEx recht "robust". ;)

EDIT: Hmpf, da war eRaaaa wohl schneller ;(
 
Zuletzt bearbeitet:

ttttttt

Mitglied
Also ich würde es mit [c]"<img .* src=\"(.+\\.jpg).*"[/c] mal versuchen,

Stimmt ja, die Zeichen vor der Grafikadresse müssen auch noch in irgendeiner Form im Pattern verpackt werden,
es wird immer der String als ganzes betrachtet und nicht erst ab da, wo der Teil beginnt, den ich gerne hätte :D

wobei das vermutlich auch nicht optimal ist.

Auch wieder richtig... denn eigentlich interessiere ich mich nicht für den kompletten String,
sondern nur für einen gewissen Teil daraus (die Grafikadresse). Ist Pattern-Matching überhaupt
geeignet für mein Vorhaben? Muss der String vllt. noch vorher gesplittet werden?

Es gibt ja nicht umsonst HTML-Parser etc. wieso benutzt du nicht einfach schon etwas fertiges ?

Das Programm schreibe ich nur zu Übungszwecken, um den Umgang mit der Sprache zu lernen.

Java:
	public static void main(String[] args) throws Exception {
		String s = "<img border=\"1\" src=\"../Visual%20History/modern%20era/mucha/28.jpg\" width=\"566\" height=\"800\"><br>";
		System.out.println(compare("<img .* src=\"(.+\\.jpg).*", s)); //../Visual%20History/modern%20era/mucha/28.jpg
	}

	public static String compare(String regex, CharSequence input) {
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(input);
		if(m.find()){
			return m.group(1);
		}
		return null;
	}

Danke. Der letzte Teil hat mir wirklich weitergeholfen. Ich hatte mich nämlich hier umgeschaut und dachte, es wäre nur möglich 'nen boolean zurück zu geben.

Edit.: So, grade nochmal aktualisiert :)
Der zweite Beitrag verdeutlicht die Lösung auf jeden Fall noch einmal.
Vielen Dank, ich werde mich dann jetzt mal an's verstehen machen.
 
Zuletzt bearbeitet:

ttttttt

Mitglied
Hallo allerseits,
da ich immer noch an diesem Programm arbeite,
hier nochmal eine Frage zu meinem (hoffentlich) letzten Problem:

die auf Basis von Mizar's Code gematchten Quelltextstellen würde ich ganz gerne einer ArrayList
Java:
import java.net.URL;
Java:
ArrayList<URL> imgURL = new ArrayList<URL>();
hinzufügen.


die für mich denkbar einfachste Lösung
Java:
imgURL.add("http://www.hier-die-adresse.com/");
funktioniert aber leider nicht, offenbar kann in eine URL ArrayList kein String hinzugefügt werden.
Das ist für mein Vorhaben erst mal recht schade... und etwas verwirrend, denn

Java:
URL test = new URL("http://www.hier-die-adresse.com/");
funktioniert doch auch, und übergibt einen String in ein einzelnes URL Objekt ???:L

Bitte um Hilfe.
 
S

SlaterB

Gast
eine kleine Metallkugel kann man in eine Plastikschale legen, und vor dir steht ein Regal mit Gitterboden, geeignet für Plastikschalen,
wenn du jetzt eine Metallkugel aufs Regal legst fällt diese durchs Gitter und alle sind traurig,
die Moral von der Geschichte: Metallkugeln nur in Plastikschalen, diese dann aufs Gitter

Strings nur in URLs, diese dann in die ArrayList, die ArrayList kann nicht automatisch ein URL-Objekt anlegen
 

Mizar

Aktives Mitglied
Ich weiß zwar das das Thema mittlerweile als erledigt gilt, aber dennoch eine kleine Ergänzung: Den zuvor von mir geposteten RegEx konnte ich noch dahingehend erweitern, dass er nun tatsächlich nur noch die Adressen der Bilder ohne Anführungszeichen als Ergebnis zurückliefert. So schaut er nun aus (mit Escapesequenzen für Java):
Code:
<img(?:\"[^\"]*\"|'[^']*'|[^\"'>])*src=[\"']((?<=\")[^\"]+|(?<=')[^']+)[\"'](?:\"[^\"]*\"|'[^']*'|[^\"'>])*/?\\s*>
Erweitert habe ich das ganze an folgender Stelle mit lookbehind-Ausdrücken:
Code:
src=[\"']((?<=\")[^\"]+|(?<=')[^']+)[\"']
Viel Spaß damit :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
J Interface Frage zu Interfces am Beispiel Observer Pattern Java Basics - Anfänger-Themen 8
V Frage zu Decorator-Pattern Java Basics - Anfänger-Themen 4
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
F Kurze Frage zu replace() Java Basics - Anfänger-Themen 19
JavaSchmecktLecker Polymorphie Frage zur Methodenüberschreibung Java Basics - Anfänger-Themen 21
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
O Frage: Formaler Typbezeichner? Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
L Frage zum Array Java Basics - Anfänger-Themen 1
A Frage zum UML Design Java Basics - Anfänger-Themen 1
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A OCA Study Guide: 2. Frage aus Kapitel 3 Java Basics - Anfänger-Themen 9
sserio Date Library Frage Java Basics - Anfänger-Themen 9
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
sserio Frage zu HashMaps Java Basics - Anfänger-Themen 20
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
sserio Frage zu BigInteger Java Basics - Anfänger-Themen 1
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
xxx12 Frage Java Basics - Anfänger-Themen 2
I Generelle Frage zu Mikroservices (Spring Boot?), Docker... Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
A Frage zur programmierung Java Basics - Anfänger-Themen 12
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
R Input/Output Frage zu Java IO Java Basics - Anfänger-Themen 6
M Frage zu printWriter Java Basics - Anfänger-Themen 5
C Frage zu OLSMultipleLinearRegression Java Basics - Anfänger-Themen 31
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
L Frage zur Ticket Maschine Java Basics - Anfänger-Themen 1
J Frage zu OOP-Klassendiagramm Java Basics - Anfänger-Themen 8
OSchriever Frage zu Compiler Java Basics - Anfänger-Themen 8
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
F Frage betreff Programmierbücher zu Lagerverwaltung als Konsolenprogramm Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
I String.split regex Frage Java Basics - Anfänger-Themen 2
dieter000 Frage zu einem Beispiel... Java Basics - Anfänger-Themen 5
J Frage zum Loggen Java Basics - Anfänger-Themen 18
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
marcooooo Frage zu bestimmten Beispiel Java Basics - Anfänger-Themen 31
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
B Erste Schritte Learning Coding (!) Frage an erfahrene Programmierer. Java Basics - Anfänger-Themen 23
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
C Exception-Frage Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
S Frage des Designs Java Basics - Anfänger-Themen 1
JavaTalksToMe Extends/Implements Frage Java Basics - Anfänger-Themen 3
pkm Frage zu Servletfunktion Java Basics - Anfänger-Themen 0
B Frage zur Währungsumrechnung Java Basics - Anfänger-Themen 3
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
D Frage zur IDE IntelliJ IDEA Java Basics - Anfänger-Themen 6
H Frage zum 2d Array Java Basics - Anfänger-Themen 1
N Frage zum Newton-Fraktal Java Basics - Anfänger-Themen 1
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
I Frage zu SkipList Java Basics - Anfänger-Themen 4
G Frage zu JScrollPane Java Basics - Anfänger-Themen 12
Kirby.exe Allgemeine Frage Java Basics - Anfänger-Themen 3
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
J Kleine Frage zu OOP Java Basics - Anfänger-Themen 371
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
F Frage zu Iteratoren Java Basics - Anfänger-Themen 2
C Erste Schritte Frage zur ArrayList Java Basics - Anfänger-Themen 15
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
H Frage zur ermittlung eines doppelte Paars aus Sotieralgorithmus Java Basics - Anfänger-Themen 4
H Frage zum Array Java Basics - Anfänger-Themen 17
G Schach -Frage 2- Maussteuerung Java Basics - Anfänger-Themen 7
G Schach in Java - Allgemeine Frage zur Architektur Java Basics - Anfänger-Themen 7
B Fachliche Frage bei Rechnungen Java Basics - Anfänger-Themen 16
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
B Frage zu Datenbank Design - Rechnungen, Angebote... und deren Positionen Java Basics - Anfänger-Themen 4
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben