Хотите перебрать все пары ключ / значение? Для этого вам не нужно смотреть назад:
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));
}
При первом вызове find()
первая часть регулярного выражения совпадает с rel="{
. При последующих вызовах вторая альтернатива (\G,
) вступает во владение, чтобы соответствовать запятой, но только если она сразу следует за предыдущим соответствием. В любом случае это оставляет вас в очереди на (\w+):(\w+)
, чтобы соответствовать следующей паре ключ / значение, и никогда не может совпадать где-либо за пределами атрибута rel
.
Я предполагаю, что вы применяете регулярное выражение к изолированному тегу IMG, как вы его опубликовали, а не ко всему HTML-файлу. Кроме того, регулярное выражение может потребоваться небольшая настройка, чтобы соответствовать вашим фактическим данным. Например, вам может потребоваться более общий ([^:]+):([^,}]+)
вместо (\w+):(\w+)
.