RegEx Advanced:积极的外观

时间:2010-04-21 14:06:32

标签: java regex lookbehind

这是我的测试字符串:

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

我想在rel属性之间获取每个JSON形成的元素。 它适用于第一个元素(objectid)。

这是我的ReqEx,工作正常:

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

但是我想做这样的事情,这不起作用:

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

所以我可以解析搜索字符串的每个元素。

我正在使用Java-ReqEx

3 个答案:

答案 0 :(得分:2)

Java(以及除.NET和JGSoft之外的几乎所有正则表达式)都不支持lookbehinds中的无限重复。

您可以改用捕获组。另外,最好使用[^{]*代替.*,并确保使用\b进行单词边界。

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

应该足够了(然后查看捕获组1的属性值。

答案 1 :(得分:1)

您想迭代所有键/​​值对吗?你不需要为了后视:

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

答案 2 :(得分:0)

Lookaheads和lookbehinds一般不包含任意正则表达式:大多数引擎(包括Java)要求它们的长度是众所周知的,所以你不能在其中使用*之类的量词。

你为什么要在这里使用前瞻和外观?只需使用捕获组,这就简单得多了。

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

现在第一个捕获组将包含ID。