2009-07-03 7 views

Antwort

24

eine Möglichkeit:

String imgRegex = "<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>"; 

eine Möglichkeit (wenn matched-insensitively). Es ist ein bisschen durcheinander und ignoriert absichtlich den Fall, in dem keine Anführungszeichen verwendet werden. Um es darzustellen, ohne sich um String Sorgen entkommt:

<img[^>]+src\s*=\s*['"]([^'"]+)['"][^>]*> 

Das passt:

  • <img
  • ein oder mehrere Zeichen, die nicht > (dmöglich, andere Attribute)
  • src
  • optional Leerzeichen
  • =
  • optional Leerzeichen
  • Startbegrenzer von ' oder "
  • Bildquelle (die nicht ein einzelnes oder doppeltes Anführungszeichen enthalten kann)
  • Endbegrenzer
  • obwohl der Ausdruck hier stoppen kann, habe ich dann:
    • null oder mehr Zeichen, die nicht > (weitere mögliche Attribute) sind
    • > den Tag

zu schließen Zu beachten:

  • Wenn Sie die src= auch, bewegen Sie die offene Klammer weiter nach links :-)
  • Diese aufnehmen möchten nicht über Begrenzer Balancing schert oder Attributwerte ohne Trennzeichen, und es kann auch schlecht gebildet Attribute (wie Attribute ersticken Dazu gehören > oder Bildquellen, die ' oder " enthalten).
  • Das Analysieren von HTML mit regulären Ausdrücken wie diesem ist nicht trivial und im besten Fall ein schneller Hack, der in den meisten Fällen funktioniert.
+0

Danke, dies gibt "" passend für Zeichenfolge . Kann dieser Ausdruck zu g geändert werden und ich nur "kk.txt"; hoffe, ich frage nicht zu viel;) –

+0

Das erste Submatch sollte zurückgeben, was Sie wollen. Informationen zum Zugriff auf die Gruppe finden Sie unter http://java.sun.com/docs/books/tutorial/essential/regex/groups.html. Sie möchten im Wesentlichen die 'group()' Methode für Ihr Übereinstimmungsergebnis mit dem Argument '1' verwenden. – DMI

+0

Sehen Sie den Code von Cletus oben für ein Beispiel, wie man eine gefangene Untergruppe bekommt - Sie wollen nur das Argument zu 'group()', um '1' zu sein. – DMI

17

Diese Frage kommt hier viel auf.

Reguläre Ausdrücke sind eine schlechte Art der Behandlung dieses Problems. Tun Sie sich einen Gefallen und verwenden Sie einen HTML-Parser.

Regexes sind flockig zum Parsen von HTML. Sie werden am Ende mit einem komplizierten Ausdruck enden, der sich in einigen Fällen, in denen anders passieren wird, unerwartet verhält.

Edit:Wenn Ihr HTML einfach ist das dann:

Pattern p = Pattern.compile("src\\s*=\\s*([\\"'])?([^ \\"']*)"); 
Matcher m = p.matcher(str); 
if (m.find()) { 
    String src = m.group(2); 
} 

Und es gibt any number of Java HTML parsers da draußen.

+0

auch XPath wäre dies besser sein * seufz * – annakata

+2

zu sagen, dass zu einem pa ohne Verlinkung rser ist nicht wirklich nützlich. – wds

+1

Ich stimme zu; aber ich habe einen kleinen Ausschnitt in Daten und für jedes Datenelement in Schleife und nicht sicher, ob Parser laden und den Wert erhalten wird aus Sicht der Leistung –

0

Sie meinen das src-Attribut des img-Tags? In diesem Fall können Sie mit folgenden Optionen gehen:

<[Ii][Mm][Gg]\\s*([Ss][Rr][Cc]\\s*=\\s*[\"'].*?[\"']) 

Das sollte funktionieren. Der Ausdruck src = '...' steht in Klammern, ist also eine Matcher-Gruppe und kann getrennt verarbeitet werden.

+0

ja; Ich brauche src Attribut vom Bild; aber diese Ausdruckskompilierung in Java; Kannst du das bitte überprüfen? –

+1

Das wird funktionieren, bis jemand Apostrophe anstelle von doppelten Anführungszeichen verwendet, um den Attributwert zu begrenzen (src = 'foo'). Außerdem würde Ihr Ansatz fehlschlagen, wenn das img-Tag andere Attribute hätte. Die Komplexität ist ziemlich hoch, obwohl Sie die meisten Fälle mit einer guten Regex richtig machen können. Ich habe aber kein Handy. –

+1

Danke für die Antwort; Diese RegEx-Kompilierung ist in Java mit folgendem Fehler fehlgeschlagen. java.util.regex.PatternSyntaxException: Unclosed gro p nahe Index 43 <[Ii] [Mm] [Gg] \ s * ([Ss] [Rr] [Cc] \ s * = \ s * \ " .? * \“ ^ –

1

Diese Antwort ist für Forscher google, weil es zu spät ist

Kopieren cletus der Fehler zeigte und seine Antwort ändern und vorbei modifizierten String src\\s*=\\s*([\"'])?([^\"']*) als Parameter übergeben in Pattern.compile für mich gearbeitet,

Hier das volle Beispiel

String htmlString = "<div class=\"current\"><img src=\"img/HomePageImages/Paris.jpg\"></div>"; //Sample HTML 

    String ptr= "src\\s*=\\s*([\"'])?([^\"']*)"; 
    Pattern p = Pattern.compile(ptr); 
    Matcher m = p.matcher(htmlString); 
    if (m.find()) { 
     String src = m.group(2); //Result 
    }