3

を使用して入力から重複する一致を抽出するにはどうすればよいString.split()ですか?

たとえば、次のように一致するものを見つけようとする場合"aba":

String input = "abababa";
String[] parts = input.split(???);

期待される出力:

[aba, aba, aba]
4

3 に答える 3

5

String#split重複する一致は得られません。文字列の特定の部分は、取得された配列の一意のインデックスにのみ含まれ、2 つのインデックスには含まれないためです。

PatternここでandMatcherクラスを使用する必要があります。この正規表現を使用できます: -

Pattern pattern = Pattern.compile("(?=(aba))");

メソッドを使用Matcher#findして重複するすべての一致を取得し、それを出力group(1)します。

上記の正規表現は、すべての空の文字列に一致しaba、その後に が続き、最初にキャプチャされたグループを出力します。これ以降look-aheadゼロ幅アサーションであるため、一致する文字列は消費されません。したがって、重複するすべての一致を取得します。

String input = "abababa";
String patternToFind = "aba";

Pattern pattern = Pattern.compile("(?=" + patternToFind + ")");
Matcher matcher = pattern.matcher(input);

while (matcher.find()) {
    System.out.println(patternToFind + " found at index: " + matcher.start());
}

出力: -

aba found at index: 0
aba found at index: 2
aba found at index: 4
于 2012-12-26T19:07:16.940 に答える
3

私はindexOfを使用します。

for(int i = text.indexOf(find); i >= 0; i = text.indexOf(find, i + 1))
   System.out.println(find + " found at " + i);
于 2012-12-26T19:28:18.760 に答える
0

これは の正しい使い方ではありませんsplit()javadocsから:

指定された正規表現の一致に基づいてこの文字列を分割します。

文字列を分割しようとしているのではなく、文字列内の正規表現のすべての一致を見つけようとしているようです。このためには、MatcherMatcherと、すべての一致を見つけてから配列を作成するためにループする追加のコードを使用する必要があります。

于 2012-12-26T19:04:49.937 に答える