Autor Thema: Regular Expressions  (Gelesen 1932 mal)

Marinero Atlántico

  • Gast
Regular Expressions
« am: 24.08.04 - 17:34:44 »
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:  

Code
 
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. ;D
 
Das Ergebnis sieht dann so aus:
Code
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
« Letzte Änderung: 24.08.04 - 18:16:20 von Marinero Atlántico »

Marinero Atlántico

  • Gast
Re:Regular Expressions
« Antwort #1 am: 26.08.04 - 10:55:13 »
Das sieht sehr sinnvoll aus, weil hier fertige regex gesammelt werden (unter Pattern):
http://www.regexplib.com/

Hier ist eine gute Übersicht über Ressourcen (u.a. auch JavaScript Tutorials):
http://faq.javaranch.com/view?ResourcesOnRegularExpressions

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz