gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:04:49 24 4
gpt4 key购买 nike

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

是否有另一种方法来捕获字符串中模式的所有实例?

表达式:(捕获高分辨率 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

最佳答案

一个有趣的问题。据我了解,全局标志不能用其他 Regex 语法功能“模拟”。

可以尝试通过 Regex 重复来模拟全局标志。您可以扩展您的 Regex,使其匹配重复循环中出现的所有 "hiRes":...。但是随后,您会看到尽管由于循环的原因,多个 URL 会被匹配,但只有最后一次出现的 URL 会被捕获

开启全局标志不仅仅是“继续寻找”。它开始收集阵列中的多个捕获。只有一个正则表达式循环不会做同样的事情。

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

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

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

现在没有全局标志。为了匹配更多,我们必须向 Regex 添加一个包含多个“i”的重复项,以及一个忽略两个“i”之间的文本的条件。像这样:

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

这乍一看似乎令人费解,但它是正确的。正则表达式 匹配 从位置 2 到位置 10。从那次匹配中,它捕获 位置 10 的最后一个“i”。因此,正则表达式中的重复不会导致多次捕获,而是更长的匹配。这与全局标志的作用非常不同。

准确的说,这种行为叫做“贪心”。它会尽可能地匹配。使用“U”标志或某些量词,您可以使 Regex 变得“不贪婪”。在这种情况下,在上面的示例中,您“粗鲁地”捕获的“i”将是位置 2 的那个。

作为一个更复杂的示例,只需增强您的初始 Regex。它必须忽略 URL 中的文本,直到下一个“hiRes”,并重复放置。在这里:

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

第二部分的意思是:尽可能多地匹配不是quota的,或者是quota后面没有hiRes的。像这样,这个语法会一直挖掘到下一个“hiRes”的开始。然后重复出现,并以“hiRes”重新开始。

尝试一下。它只会捕获文本中的最后一个 URL。

最后,这个教程很全面:http://www.regular-expressions.info/

关于不使用全局标志的正则表达式全局搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28954554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com