2017-02-04 72 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