正则表达式全局搜索不使用全局标志

时间:2015-03-10 01:06:52

标签: regex

我使用的软件只允许单行正则表达式进行过滤,并且不允许全局修饰符捕获字符串中的所有模式。目前,我的表达式只返回第一个实例。

是否有其他方法可以捕获字符串中模式的所有实例?

表达:(捕捉高分辨率jpg网址)

\{\"hiRes\"\:\"([A-Za-z0-9%\/_:.-]+)\"\,\"thumb

字符串:

'colorImages': { 'initial': [{"hiRes":"http://sub.website.com/images/I/81OJ6qwKxyL._SL1500_.jpg","thumb":"http://sub.website.com/images/I/41NQRigTUdL._SS40_.jpg","large":"http://sub.website.com/images/I/41NQRigTUdL.jpg","main":{"http://sub.website.com/images/I/81OJ6qwKxyL._SY355_.jpg":[272,355],"http://sub.website.com/images/I/81OJ6qwKxyL._SY450_.jpg":[345,450],"http://sub.website.com/images/I/81OJ6qwKxyL._SY550_.jpg":[422,550],"http://sub.website.com/images/I/81OJ6qwKxyL._SY606_.jpg":[465,606],"http://sub.website.com/images/I/81OJ6qwKxyL._SY679_.jpg":[521,679]},"variant":"MAIN"},{"hiRes":"http://sub.website.com/images/I/71oHZNvsLbL._SL1500_.jpg","thumb":"http://sub.website.com/images/I/31lHNGD-ZDL._SS40_.jpg","large":"http://sub.website.com/images/I/31lHNGD-ZDL.jpg","main":{"http://sub.website.com/images/I/71oHZNvsLbL._SY355_.jpg":[197,355],"http://sub.website.com/images/I/71oHZNvsLbL._SY450_.jpg":[249,450],"http://sub.website.com/images/I/71oHZNvsLbL._SY550_.jpg":[305,550],"http://sub.website.com/images/I/71oHZNvsLbL._SY606_.jpg":[336,606],"http://sub.website.com/images/I/71oHZNvsLbL._SY679_.jpg":[376,679]},"variant":"PT01"},{"hiRes":"http://sub.website.com/images/I/91VCJAcIPEL._SL1500_.jpg","thumb":"http://sub.website.com/images/I/51G1gCkOFzL._SS40_.jpg","large":"http://sub.website.com/images/I/51G1gCkOFzL.jpg","main":{"http://sub.website.com/images/I/91VCJAcIPEL._SX355_.jpg":[355,341],"http://sub.website.com/images/I/91VCJAcIPEL._SX450_.jpg":[450,433],"http://sub.website.com/images/I/91VCJAcIPEL._SX425_.jpg":[425,409],"http://sub.website.com/images/I/91VCJAcIPEL._SX466_.jpg":[466,448],"http://sub.website.com/images/I/91VCJAcIPEL._SX522_.jpg":[522,502]},"variant":"PT02"},{"hiRes":"http://sub.website.com/images/I/912B68GN4aL._SL1500_.jpg","thumb":"http://sub.website.com/images/I/51elravQx6L._SS40_.jpg","large":"http://sub.websi

1 个答案:

答案 0 :(得分:0)

一个有趣的问题。根据我的理解,全球旗帜不能被模仿"与其他正则表达式语法功能。

可以尝试通过正则表达式重复来模拟全局标志。您可以展开正则表达式,使其在重复循环中匹配"hiRes":...的所有外观。但是,您会看到虽然由于循环,多个URL将匹配,但只有最后一次出现已捕获

开启全球旗帜不仅仅是"继续寻找"。它开启了在阵列中收集多个捕获。只有一个正则表达式循环不会做同样的事情。

我想展示两个例子,这意味着什么。要测试这些例子,请使用例如https://regex101.com/

这是一个简单的例子,首先是全局标志:

  • 给定文字:a i b i c i
  • 正则表达式:/(i)/g
  • 结果:三个字符串的数组[0]="i" Pos.2, [1]="i" Pos.6, [2]="i Pos.10"

现在没有全球旗帜。为了匹配更多,我们必须在正则表达式中添加重复,其中包含几个" i",以及忽略两个" i"之间的文本的条件。像这样:

  • 给定文字:a i b i c i
  • 正则表达式:/(?:(i)[^i]*)+/
  • 结果:一个字符串数组[0]="i" Pos.10

这首先令人费解,但这是正确的。正则表达式从位置2到10匹配。从该匹配开始,它捕获最后一个" i"因此,正则表达式中的重复不会导致多次捕获,而是导致更长的匹配。这与全球旗帜的作用非常不同。

准确地说,这种行为被称为"贪婪"。它尽可能地尝试匹配。随着" U"标记或某些量词,你可以使正则表达式" ungreedy"。在上面的例子中,你的" ungreedily"捕获"我"将是第2位。

作为一个更复杂的例子,只需增强您的初始正则表达式。它必须忽略URL中的文本,直到下一个" hiRes"并重复出现。这是:

/\{(?:"hiRes":"([A-Za-z0-9%\/_:.-]+)"(?:[^"]|"(?!hiRes))*)+/

第二部分意味着:匹配尽可能多的非配额,或者配额不是hiRes。像这样,这个语法将一直挖到下一个" hiRes"的开头。然后重复进来,它开始于" hiRes"。

试一试。它将仅捕获文本中的最后一个URL。

最后,本教程非常全面:http://www.regular-expressions.info/