Это - моя тестовая строка:
<img rel="{objectid:498,newobject:1,fileid:338}" width="80" height="60" align="left" src="../../../../files/jpg1/Desert1.jpg" alt="" />
Я хочу добраться, каждый из JSON сформировал промежуток Элементов атрибут рэла. Это работает на первый элемент, которому (возражают).
Вот мой ReqEx, который хорошо работает:
(?<=(rel="\{objectid:))\d+(?=[,|\}])
Но я хочу сделать что-то как это, которое не работает:
(?<=(rel="\{.*objectid:))\d+(?=[,|\}])
Таким образом, я могу проанализировать каждый элемент строки поиска.
Я использую Java-ReqEx
Вы хотите перебрать все пары ключ / значение? Для этого не нужно искать назад:
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 +)
.
Предварительный просмотр и просмотр назад не могут содержать произвольные регулярные выражения в общем: для большинства движков (включая Java) требуется, чтобы их длина была хорошо известна, поэтому вы не можете использовать в них квантификаторы, такие как *
.
Почему вы вообще здесь используете прогнозирование вперед и назад? Вместо этого просто используйте группы захвата, это намного проще.
rel="\{.*objectid:(\d+)
Теперь первая группа захвата будет содержать идентификатор.
Java (и почти все разновидности регулярных выражений, кроме .NET и JGSoft) не поддерживают бесконечное повторение внутри просмотра назад.
Вместо этого вы можете использовать группы захвата. Кроме того, лучше использовать [^ {] *
вместо . *
и обеспечить границы слов с помощью \ b
.
rel="\{[^{]*\bobjectid:(\d+)
должно быть достаточно (тогда посмотрите на группу захвата 1 для значения атрибута.