gpt4 book ai didi

java - 正则表达式仅匹配最后一次出现的情况

转载 作者:行者123 更新时间:2023-12-01 08:07:26 27 4
gpt4 key购买 nike

我的正则表达式是:

流派\":\[(?=.*名称\":\"(.*?)\"}(?=.*\"主页))

我的目标是:

{
"adult":false,
"backdrop_path":"/b9OVFl48ZV2oTLzACSwBpNrCUhJ.jpg",
"belongs_to_collection": {
"id":135468,
"name":"G.I. Joe (Live-Action Series)",
"poster_path":"/5LtZM6zLB2TDbdIaOC5uafjYZY1.jpg",
"backdrop_path":"/m3ip0ci0TnX0ATUxpweqElYCeq4.jpg"
},
"budget":185000000,
"genres":[
{
"id":28,
"name":"Action"
},
{
"id":12,
"name":"Adventure"
},
{
"id":878,
"name":"Science Fiction"
},
{
"id":53,
"name":"Thriller"
}
],
"homepage":"http://www.gijoemovie.com",
"id":72559,
"imdb_id":"tt1583421",
"original_title":"G.I. Joe: Retaliation",
"overview":"Framed for crimes against the country, the G.I. Joe team is terminated by Presidential order. This forces the G.I. Joes into not only fighting their mortal enemy Cobra; they are forced to contend with threats from within the government that jeopardize their very existence.",
"popularity":11.7818680433822,
"poster_path":"/swk1AHwPvIJv8NUFM1qpFuaT642.jpg",
"production_companies":[
{
"name":"Paramount Pictures",
"id":4
},
{
"name":"Metro-Goldwyn-Mayer (MGM)",
"id":8411
}
],
"production_countries":[
{
"iso_3166_1":"US",
"name":"United States of America"
}
],
"release_date":"2013-03-29",
"revenue":371876278,
"runtime":110,
"spoken_languages":[
{
"iso_639_1":"en",
"name":"English"
}
],
"status":"Released",
"tagline":"GI JOE IS NO MORE",
"title":"G.I. Joe: Retaliation",
"vote_average":5.4,
"vote_count":1806
}

我知道它是 JSON,我应该使用 JSON 类或比 Regex 更好的东西来使用它,但是,在这个项目中我仅限于 Regex。

我正在使用 http://regexhero.net/tester/ 测试我的正则表达式当我应该看 Action 、冒险、科幻小说、惊悚片时,我只看惊悚片,所有这些。

PS:我正在使用 Java 和 java.util.regex

List<String> generos = new ArrayList<>();

Matcher filter = Pattern.compile("genres\":\\[(?=.*name\":\"(.*?)\"}(?=.*\"homepage))").matcher(response);

while (filter.find()) {
generos.add(filter.group(1));
}

代码完全没问题,唯一的问题在于正则表达式。只需在任何正则表达式测试器中尝试此正则表达式,您就会发现它只获得最后一次出现,但我需要所有这些。

最佳答案

这似乎有效:

(?<!^)(?:genres|\G)[^]]*?"name":"(.*?)"  

\G本质上匹配上一个匹配结束的位置(如果尚未匹配任何内容,则匹配字符串的开头)。 [docs ]

因此,从\G开始可以匹配字符串的开头(但我们不希望如此),首先确保我们不在带有负向后查找的字符串开头 (?<!^) .

然后,找到“流派”或 \G (您的匹配之前停止的地方),然后开始寻找“名称”。 [^]]*? 中的量词变得懒惰了 ?因此,当它找到第一个“名称”时,它将停止,而不是继续贪婪地继续,直到它通过其他“名称”并仅找到最后一个。

您想要的文本将在第 1 组中捕获。

关于java - 正则表达式仅匹配最后一次出现的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20431942/

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