0

.NETでは、文字のシーケンスを、何度も発生するキャプチャグループを表すパターンと照合する場合は、次のように記述できます。

String input = "a, bc, def, hijk";
String pattern = "(?<x>[^,]*)(,\\s*(?<y>[^,]*))*";

Match m = Regex.Match(input, pattern);
Console.WriteLine(m.Groups["x"].Value);

//the group "y" occurs 0 or more times per match
foreach (Capture c in m.Groups["y"].Captures)
{
    Console.WriteLine(c.Value);
}

このコードは次のように出力します。

a
bc
def
hijk

これは簡単に思えますが、残念ながら、次のJavaコードは.NETコードのようには機能しません。(java.util.regexはグループとキャプチャを区別していないように見えるため、これは予想されます。)

String input = "a, bc, def, hijk";
Pattern pattern = Pattern.compile("(?<x>[^,]*)(,\\s*(?<y>[^,]*))*");

Matcher m = pattern.matcher(input);

while(m.find())
{
     System.out.println(m.group("x"));
     System.out.println(m.group("y"));
}

プリント:

a
hijk

null

正規表現を書き直したり、外部ライブラリを使用したりせずに、Javaを使用して同じことを実現する方法を誰かが説明できますか?

4

2 に答える 2

1

あなたが望むことはJavaでは不可能です。同じグループが複数回一致した場合、そのグループの最後のオカレンスのみが保存されます。詳細については、パターンドキュメントのセクション「グループとキャプチャ」を参照してください。Javaでは、Matcher/は「リアルタイム」でPattern反復するために使用されます。String

繰り返しの例:

String input = "a1b2c3";
Pattern pattern = Pattern.compile("(?<x>.\\d)*");
Matcher matcher = pattern.matcher(input);
while(matcher.find())
{
     System.out.println(matcher.group("x"));
}

印刷(*は空の文字列にも一致するためnull):

c3
ヌル

それなし:

String input = "a1b2c3";
Pattern pattern = Pattern.compile("(?<x>.\\d)");
Matcher matcher = pattern.matcher(input);
while(matcher.find())
{
     System.out.println(matcher.group("x"));
}

プリント:

a1
b2
c3
于 2013-03-25T01:05:40.573 に答える
0

JavaではPatternクラスとMatcherクラスを使用できます。少し違います。たとえば、次のコード:

Pattern p = Pattern.compile("(el).*(wo)");
Matcher m = p.matcher("hello world");
while(m.find()) {
  for(int i=1; i<=m.groupCount(); ++i) System.out.println(m.group(i));
}

2つの文字列を出力します:

el
wo
于 2013-03-25T01:14:23.900 に答える