从一个小时以来,我一直在使用正则表达式。因此,在此之下是我要解析的文本。
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,
最佳答案
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());
}