从一个小时以来,我一直在使用正则表达式。因此,在此之下是我要解析的文本。

AddAgenda("Gangster's agenda",
{
    TEAM_HITMAN,
    TEAM_POLICE
},
{
    TEAM_GANG,
    TEAM_MAFIA,
    TEAM_GANGSTER
})


我想从每对花括号中分别捕获每个团队的议程名称。要知道的一件事是,我不知道这些对中有多少支球队。

基本上,我想要这样:

Group [1]:
    Gangster's agenda
Group [2]:
    Group [0]: TEAM_HITMAN
    Group [1]: TEAM_POLICE
Group [3]:
    Group [0]: TEAM_GANG
    Group [1]: TEAM_MAFIA
    Group [2]: TEAM_GANGSTER


但是我只想出了这个:

AddAgenda\(\"([^"]+)\",\s*\{(\s*([\w_]+,))*


产生此结果:

Group [0]:
    [0]: AddAgenda("Gangster's agenda",
{
    TEAM_MOB,
    TEAM_POLICE,
Group [1]:
    [0]: Gangster's agenda
Group [2]:
   [0]:
    TEAM_POLICE,
Group [3]:
    [0]: TEAM_POLICE,

最佳答案

This my try

AddAgenda\(\"([^"]+)\",\s*\{(\s*([\w_]+)\s*,?\s*([\w_]+)\s*)},\s*{\s*(([\w_]+)\s*,?\s*([\w_]+)?\s*,?\s*([\w_]+)?)\s*}\s*\)


因此,请看您的问题,第3组第4组包含在第2组中,第6,7,8组(TEAM_GANG,TEAM_MAFIA,TEAM_GANGSTER)包含在第5组中。

我们仅使用一个正则表达式的问题是您无法为每个TEAM自动生成一个新的捕获组。需要明确的是,正则表达式的一个功能是可以将量词应用于模式。 \ d +会吃掉更多的数字。例如,正则表达式(\ d)将数字捕获到组1中。

那么,如果将两者放到这个正则表达式中会发生什么呢?

(\d)+

您在模式中看到的捕获括号仅捕获单个组。因此,在(\ d)+中,捕获组不再继续重复匹配。正则表达式反复引用同一组。如果您在1234上尝试(\d)+正则表达式,则组1将包含4(最后一个捕获)。

简而言之,每次正则表达式遍历捕获括号时,第1组都将被覆盖。

使用两个正则表达式可以将问题分为两部分。首先匹配AddAgenda中的三个参数。然后将两个参数分成大括号。

First regular表达式可以是:

AddAgenda\("([^"]+)",\s*\{\s*([^}]+)\},\s*\{\s*([^}]+)\s*\}\)


Second regular expression非常简单。

([\w_]+)


在这种情况下,您可以在Java中执行以下代码:

Matcher m = Pattern.compile("[\\w_]+").matcher(s);
while (m.find()) {
    System.out.println(m.group());
}

10-07 19:35