2010-04-21 9 views
5

Dies ist mein Test-string:RegEx Advanced: Positiver Lookbehind

<img rel="{objectid:498,newobject:1,fileid:338}" width="80" height="60" align="left" src="../../../../files/jpg1/Desert1.jpg" alt="" /> 

ich jeder der JSON erhalten möge Elemente zwischen dem rel-Attribute gebildet. Es funktioniert für das erste Element (Objectid).

Hier ist meine ReqEx, der gut arbeitet:

(?<=(rel="\{objectid:))\d+(?=[,|\}]) 

Aber ich möchte somthing wie dies zu tun, was nicht funktioniert:

(?<=(rel="\{.*objectid:))\d+(?=[,|\}]) 

So kann ich jedes Element des parsen Suchbegriff.

Ich bin mit Java-ReqEx

Antwort

0

Lookaheads und Lookbehinds nicht willkürlich reguläre Ausdrücke im allgemeinen enthalten: Die meisten Motoren (Java enthalten) verlangen, dass ihre Länge ist gut bekannt, so dass Sie nicht quantifiers wie * verwenden können in ihnen.

Warum benutzen Sie hier Lookaheads und Lookbehinds? Verwenden Sie stattdessen Capture-Gruppen, das ist viel einfacher.

rel="\{.*objectid:(\d+) 

Jetzt enthält die erste Erfassungsgruppe die ID.

+0

Nicht wirklich. Unendliche Wiederholung ist kein Problem im Lookahead, nur im Lookbehind. –

2

Java (und fast alle Regex-Varianten außer .NET und JGSoft) unterstützen keine unendlichen Wiederholungen innerhalb von Lookbehinds.

Sie könnten stattdessen Erfassungsgruppen verwenden. Verwenden Sie auch besser [^{]* anstelle von .* und stellen Sie Wortgrenzen mit \b sicher.

rel="\{[^{]*\bobjectid:(\d+) 

sollte ausreichend sein (dann sehen Sie die Erfassungsgruppe 1 für den Wert des Attributs.

1

Sie durch alle Schlüssel/Wert-Paare iterieren Wollen? Sie haben keine Lookbehind müssen dafür :.

String s = 
    "<img rel=\"{objectid:498,newobject:1,fileid:338}\" " + 
    "width=\"80\" height=\"60\" align=\"left\" " + 
    "src=\"../../../../files/jpg1/Desert1.jpg\" alt=\"\" />"; 
Pattern p = Pattern.compile(
    "(?:\\brel=\"\\{|\\G,)(\\w+):(\\w+)"); 
Matcher m = p.matcher(s); 
while (m.find()) 
{ 
    System.out.printf("%s = %s%n", m.group(1), m.group(2)); 
} 

das erste Mal find(), der erste Teil der Regex rel="{ entspricht genannt wird bei nachfolgenden Aufrufen, nimmt die zweite Alternative (\G,), ein Komma passen vorbei, aber nur, wenn es folgt unmittelbar auf die vorherigen ma tch. In beiden Fällen werden Sie für (\w+):(\w+) aufgereiht, damit sie dem nächsten Schlüssel/Wert-Paar entsprechen, und es kann niemals irgendwo außerhalb des rel Attributs übereinstimmen.

Ich gehe davon aus, dass Sie die Regex auf ein isoliertes IMG-Tag anwenden, wie Sie es gepostet haben, nicht auf eine ganze HTML-Datei. Außerdem muss die Regex möglicherweise etwas angepasst werden, um den tatsächlichen Daten zu entsprechen. Zum Beispiel möchten Sie vielleicht die allgemeinere ([^:]+):([^,}]+) anstelle von (\w+):(\w+).