组中的Java Regex组

时间:2017-02-04 14:09:38

标签: java regex regex-group

我现在一小时以来一直在与正则表达式斗争。所以,就在这下面是我要解析的文字。

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

我想从每对花括号中捕获议程名称,每个团队 INDIVUDUALLY 。有一点需要知道的是,我不知道每对中有多少队。

基本上,我想要这个:

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,

2 个答案:

答案 0 :(得分:1)

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());
}

答案 1 :(得分:-1)

这样的东西?

\"(.*)\"|\s([A-Z_].*)

https://regex101.com/r/6vJpXe/1