2017-02-04 11 views
1

私は1時間後から正規表現に苦労しています。ですから、私はこのテキストを解析したいと思っています。Java Regexグループ内のグループ

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

を。まだ何か試しましたか? –

+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

だからあなたの質問を見て、グループ3,4はグループ2、グループ6,7,8に含まれ
AddAgenda\(\"([^"]+)\",\s*\{(\s*([\w_]+)\s*,?\s*([\w_]+)\s*)},\s*{\s*(([\w_]+)\s*,?\s*([\w_]+)?\s*,?\s*([\w_]+)?)\s*}\s*\) 

(TEAM_GANG、TEAM_MAFIA、TEAM_GANGSTER)グループ5に含まれています。

正規表現を1つだけ使用すると、TEAMごとに新しいキャプチャグループを自動的に生成できないという問題があります。明確にするために、正規表現の1つの特徴は、パターンに数量子を適用できることです。 \ d +はより多くの数字を食べます。たとえば、正規表現(\ d)は1桁の数字をグループ1に取り込みます。

この2つを一緒にこの正規表現に入れるとどうなりますか?

(\d)+

あなたがパターンで見キャプチャ括弧は、単一の基のみをキャプチャします。したがって、(\ d)+では、キャプチャグループはマッチの再実行を続行しません。正規表現は繰り返し同じグループを参照します。 1234で(\d)+正規表現を試すと、グループ1には最後のキャプチャである4が含まれます。

ナットシェルでは、正規表現がキャプチャ括弧を反復処理するたびに、グループ1が上書きされています。

2つの正規表現を使用すると、問題を2つの部分に分けることができます。まず、AddAgendaの3つのパラメータを一致させます。 2つのパラメータを中括弧で分割します。

First regularの式は次のようになります。

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

Second regular expression非常にシンプル。この場合

([\w_]+) 

、Javaで次のコードを実行できます。ただ、入力の各部分を読み取り、希望値を抽出_parser_を書く

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

あなたの答えをありがとう、私はチームを追加/削除する場合、正規表現はもう動作しません。 – x84x4

+0

私は自分の答えを更新しました。このバージョンは欠けているチームを処理します。 – freedev

+0

まだ期待どおりに動作しませんでした。nvm代わりに2つの正規表現を使用します。 – x84x4

関連する問題