Regular Expressions (RE) ist etwas sehr altes, das vermutlich unter Unix entwickelt wurde.
Es ist eine Art Technik, wo man mittels ein bischen kryptisch aussehenden (sagen wir) Suchstrings Texte durchsuchen kann.
RE gibt es auf total vielen Programmierumgebungen: (egrep auf Linux, Java, Perl, vermutlich .NET, sehr wahrscheinlich Python, C, etc. pp.).
Ich fand das immer interessant, hatte aber bisher keine praktische Anwendung dafür. Hier haben öfters mal Leute Interesse bekundet.
Seit Java 1.4 gibt es in dem JSDK RE-packages (für Java2 gab es bereits open Source Implementierungen, die man sich als Zusatz-jar zum Projekt packen konnte.
Ich hab jetzt meinen ersten Fall (einen sehr einfachen) mit Regex zur Hälfte gelöst.
Es geht darum alle img-Tags aus einer Webseite zu extrahieren, d.h. eigentlich sollten alle url-Attribute von allen img-Tags einer Webseite extrahiert werden, aber deshalb ist es eben nur halb gelöst.
Falls also jemand irgendwelche Ideen, Source Code oder sonstigen Beiträge hat, immer her damit. Hier ist der Source Code meines ersten Versuchs:
Wirklich gerade für Einsteiger sehr geeignet ist das entsprechende Buch von Mehran (Max) Habibi (try amazon), womit ich in nur 2 Stunden die Aufgabe sicherlich suboptimal lösen konnte:
import java.util.regex.*;
/**
* Finds all IMG tags in a website.
*
* @author Axel Janssen
* @version 0.64793 23.08.04
* @todo matcher should
*/
public class FindA{
public static void main(String args[])
throws Exception{
String candidate =
"<!-- tpl:insert page=\"/theme/A_blue.htpl\" --><!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"+
"<html>\n"+
"<head>\n"+
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">\n"+
"<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">\n"+
"<link rel=\"stylesheet\" href=\"/Smileys/theme/blue.css\" type=\"text/css\">\n"+
"<!-- tpl:put name=\"headarea\" -->\n"+
"<title>page.html</title>\n"+
"<!-- /tpl:put -->\n"+
"</head>\n"+
"<body>\n"+
"<table width=\"760\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n"+
" <tbody>\n"+
" <tr>\n"+
" <td valign=\"top\">\n"+
" <table class=\"header\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\">\n"+
" <tbody>\n"+
" <tr>\n"+
" <td width=\"150\"><IMG border=\"0\" width=\"150\" height=\"55\" alt=\"Firmenlogo\" src=\"/Smileys/theme/logo_blue.gif\"></td>\n"+
" <td></td>\n"+
" </tr>\n"+
" </tbody>\n"+
" </table>\n"+
" </td>\n"+
" </tr>\n"+
" <tr>\n"+
" <td valign=\"top\" class=\"nav_head\" height=\"20\"></td>\n"+
" </tr>\n"+
" <tr class=\"content-area\">\n"+
" <td valign=\"top\" height=\"350\"><!-- tpl:put name=\"bodyarea\" -->\n"+
" <IMg border=\"0\" src=\"pin.gif\" width=\"16\" height=\"16\"><!-- /tpl:put --></td>\n"+
" </tr>\n"+
"<tr>\n"+
" <td valign=\"top\" height=\"20\" class=\"footer\"></td>\n"+
" </tr>\n"+
" </tbody>\n"+
" </table>\n"+
" </body>\n"+
" </html>\n"+
" <!-- /tpl:insert -->";
//"A Matcher examines the results of applying a pattern.";
// am schwierigsten war das mit dem Punkt!!!
String regex = "<(I|i)(M|m)(G|g)(\\w|\\s|\"|'|=|\\.| |/)+>";
Pattern p = Pattern.compile(regex);
//extract the Matcher for the String text
Matcher m = p.matcher(candidate);
String val=null;
//display the original input string
System.out.println("INPUT: " + candidate);
//display the search pattern
System.out.println("REGEX: " + regex +"\r\n");
//examine the Matcher, and extract all
//hits
while (m.find())
{
val = m.group();
System.out.println("MATCH: " + val);
}
//if there were no matches, say so
if (val == null) {
System.out.println("NO MATCHES: ");
}
}
}
Leute mit Java1.4 können das ohne Zusatz jars starten und kompilieren.
Entwarnung: Die zahlreichen Zeilen hinter String candidate = sind einfach nur die Beispiel-Webseite als String.
Das Ergebnis sieht dann so aus:
REGEX: <(I|i)(M|m)(G|g)(\w|\s|"|'|=|\.| |/)+>
MATCH: <IMG border="0" width="150" height="55" alt="Firmenlogo" src="/Smileys/theme/logo_blue.gif">
MATCH: <IMg border="0" src="pin.gif" width="16" height="16">
Gruß Axel