Усовершенствованный RegEx: Положительный lookbehind

Это - моя тестовая строка:

<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

5
задан mpneuried 21 April 2010 в 14:06
поделиться

3 ответа

Вы хотите перебрать все пары ключ / значение? Для этого не нужно искать назад:

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 +) .

1
ответ дан 15 December 2019 в 06:20
поделиться

Предварительный просмотр и просмотр назад не могут содержать произвольные регулярные выражения в общем: для большинства движков (включая Java) требуется, чтобы их длина была хорошо известна, поэтому вы не можете использовать в них квантификаторы, такие как * .

Почему вы вообще здесь используете прогнозирование вперед и назад? Вместо этого просто используйте группы захвата, это намного проще.

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

Теперь первая группа захвата будет содержать идентификатор.

0
ответ дан 15 December 2019 в 06:20
поделиться

Java (и почти все разновидности регулярных выражений, кроме .NET и JGSoft) не поддерживают бесконечное повторение внутри просмотра назад.

Вместо этого вы можете использовать группы захвата. Кроме того, лучше использовать [^ {] * вместо . * и обеспечить границы слов с помощью \ b .

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

должно быть достаточно (тогда посмотрите на группу захвата 1 для значения атрибута.

2
ответ дан 15 December 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: