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

标签 java regex

我的正则表达式是:

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

我的目标是:

{
    "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/

相关文章:

java - 将 LinkedHashSet 转换为列表

Java 8 young gc花费超过1s,如何减少新生代gc时间

Java字符串替换-非捕获组捕获

python - 混合正则表达式和 shell 通配符

regex - 使用正则表达式匹配递增整数列表

java - 具有返回 null 的双数组 get 方法的映射

java - 为什么java regex模式错误出现在windows环境中而不是solaris环境中

java - java中如何改变字符串的字体?

javascript - 使用 jQuery 将长字符串拆分为文本 block

javascript - 替换部分属性值