2012-03-16 9 views
0

リスト内の要素の位置と長さを取得したい。したがって、私は正規のグループ分けを使用したいと思います。なぜなら、一致するグループのオフセットと長さを得ることができるからです。要素はカンマで区切られ、任意の種類の文字を含むことができます。ここでは例です:Java正規表現のグループ化を使ったスキャンリスト

(1234、A {}、 "foo" という)

ここでは、私が実行しようとしましたものです:

String textToMatch = "(1234, A{}, \"foo\")"; 
Pattern p = Pattern.compile("\\(\\s*([^,]+?)(?:\\s*,\\s*([^,]+?)\\s*)*\\)"); 
Matcher m = p.matcher(textToMatch); 

if (m.find()) { 
    for (int i = 1; i <= m.groupCount(); i++) { 
     System.out.println(m.group(i)); 
    } 
} 

残念ながら、これは動作しません。最初と最後の要素だけを取得しますが、その間の要素は取得しません。

1234 
"foo" 

私が代わりにそれが動作星演算子を使用して、同じ正規表現3回を使用する場合:ここで私は上記のコードで取得する出力です。私はグループを反復することで間違ったことをすると思います。何か案は?

+0

私は非常によくJavaの正規表現を知っているが、しないでください:あなたは1〜Iを行っている何らかの理由があるより少なくより等しいgroupCount()、代わりに0 groupCount未満に( )? – mfrankli

+0

@mfrankli:グループは1ベースであり、0ベースではありません。 (これはほぼすべての正規表現エンジンで標準です)。Javaでは、グループ0は一致する部分文字列全体と一致する疑似グループです。 – ruakh

答えて

1

文字列全体をfindへの1回の呼び出しで照合するのではなく、各リスト要素に一致する正規表現を作成し、それらの一致をループする必要があると思います。たとえば、次のように

// regex for any sequence of non-comma, non-parenthesis characters that 
// neither starts nor ends with whitespace: 
Pattern p = Pattern.compile("[^,\\s()](?:[^,()]*[^,\\s()])?"); 
Matcher m = p.matcher(textToMatch); 
while (m.find()) { 
    System.out.println(m.group()); // print entire matched substring 
}