5

这是我的测试字符串:

<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

4

3 回答 3

2

Java(以及除了 .NET 和 JGSoft 之外的几乎所有正则表达式风格)不支持在后视中无限重复。

您可以改用捕获组。此外,更好地使用[^{]*而不是.*,并确保单词边界与\b.

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

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

于 2010-04-21T14:09:47.913 回答
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+).

于 2010-04-21T14:58:50.783 回答
0

Lookaheads 和lookbehinds 通常可能不包含任意正则表达式:大多数引擎(包括Java)要求它们的长度是众所周知的,因此您不能使用*它们中的量词。

无论如何,你为什么在这里使用前瞻和后瞻?只需使用捕获组,这要简单得多。

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

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

于 2010-04-21T14:09:08.690 回答