2017-02-04 73 views
1

自从现在一小时以来,我一直在努力应对正则表达式。所以,下面这是我想解析的文本。Java正则表达式组内的组

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, 
+6

只写一个_parser_读取每件输入并提取想要的值。你尝试过什么吗? –

+6

我从来没有理解过使用正则表达式来处理这种事情的魅力。只需编写想要解析文本的代码即可。为什么使它变得不必要的复杂和难以辨认? – nhouser9

+1

@ nhouser9我认为问题在于人们发现了正则表达式,然后假设它是处理文本的唯一工具。你知道,[一切看起来像钉子](https://en.m.wikipedia.org/wiki/Law_of_the_instrument)。 –

回答

-1

像这样的事情?

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

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

+0

感谢您的回答,但问题是我无法区分每个团队属于哪个组。 – x84x4

+0

啊。好的。错误的问题。 –

0

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

感谢您的回答,但如果我添加/删除团队,您的正则表达式不再有效。 – x84x4

+0

我已经更新了我的答案,这个版本处理失踪的队伍。 – freedev

+0

仍然没有按预期工作,nvm我只会使用2个正则表达式代替。 – x84x4