2011-06-24 36 views
0

私は(一種の)形の典型的な文字列に一致し、一般的な正規表現で問題を抱えていますJava正規表現最長一致

... "field1" "field2" "field3" "field4" ... 

である私は何をしたい、もちろん、これらのそれぞれを取得しますフィールドは別々です。フィールドは、任意の文字を含めることができますので、私は、フォーム

... \"(.*?)\" +\"(.*?)\" +\"(.*?)\" +\"(.*?)\" + ... 

の「キャッチオール」正規表現を使用しています問題は、これらの4をマージしている、代わりに4つの異なるグループの製造、Javaは私に一つだけを与え、あります上記、すなわち私は、単一のフィールドを取得する:

field1" "field2" "field3" "field4 

代わりの

field1 
field2 
field3 
field4 

私は偶数フィールドごとに「\ \ "([^ \"] *)のようなことをやって試してみました、結果は同じです。

これら4つのフィールドを個別に取得するにはどうすればよいですか?

答えて

1

matcher.find()を呼び出すたびに、次の試合に移動します:あなたは本当に1試合で4つのすべてをキャプチャしたい場合は

String input = "... \"field1\" \"field2\" \"field3\" \"field4\" ..."; 
Matcher matcher = Pattern.compile("\"(.*?)\"").matcher(input); 
while (matcher.find()) 
    System.out.println(matcher.group(1)); 

または、:

Matcher matcher = Pattern.compile("\"(.*?)\".*?\"(.*?)\".*?\"(.*?)\".*?\"(.*?)\".*?").matcher(input); 
if (matcher.find()) { 
    System.out.println(matcher.group(1)); 
    System.out.println(matcher.group(2)); 
    System.out.println(matcher.group(3)); 
    System.out.println(matcher.group(4)); 
} 

どちらも同じ出力を生成し、これ次のとおりです。

field1 
field2 
field3 
field4 
1

matcher.group(1)、matcher.group(2)などを呼び出して個々の一致を取得していますか?デフォルトのメソッドはすべてのフィールドであるマッチ全体を返します。

2

このような入力については、String.splitメソッドを試してみてください。

String input = "... \"field1\" \"field2\" \"field3\" \"field4\" ..."; 
    String[] split = input.split("\"\\s*\"?"); 
    String field1 = split[1]; // field1 
    String field2 = split[2]; // field2 
    String field3 = split[3]; // field3 
    String field4 = split[4]; // field4 
+0

split [x] - インデックスは0から始まります。 – Nrj

+0

@Nrj:index 0は空の文字列または "field1"文字列のプレフィックスを持つことがあります。試して確認してください。 –