0

簡単な質問ですが、回避策がなければ解決策が見つかりません。

sthを解析したい。お気に入り

1) item1;; item3
2) item1;item2;
3) ; item2;
4) ;;
...

特定のインデックスにあるすべてのアイテムを一致させて文字列リストとして返す一致関数があります。

public static List<String> getAllMatchings(String input, String reg, int groupIndex) {
    Pattern pattern = Pattern.compile(reg);     
    Matcher matcher = pattern.matcher(input);   

    List<String> ls = new ArrayList<String>();

    while (matcher.find()) {
        if (groupIndex <= matcher.groupCount()) {
            ls.add(matcher.group(groupIndex));
        }
    }

    return ls;
}

今、そのような行があるので、{ "item1", "item2", "item3" } のような文字列リストが必要です。しかし、私は - 私のソリューションを使用して - { "item1", "item2", "item3", "" }:

List<String> strList = getAllMatchings(line, "([^;]*)(;|\\z)",1);

したがって、醜い回避策を講じる必要があります。

strList.remove(strList.size()-1);

よくない。しかし、私はその問題の解決策を見つけていません。誰かが私を助けることができますか?

追記:ちなみに。この回避策が機能しない場合があります。ケース 4) では、空の要素が 2 つしかありません。

4

4 に答える 4

1

セミコロンで分割しないのはなぜですか?

更新: 正しい数の要素を確保するためにセミコロンを数えます

int count = StringUtils.countMatches("item1;item2;;;;", ";");
String[] values = input.split(";",count);

( Commons Langが必要です)

于 2013-03-04T12:58:34.237 に答える
0

空でない場合にのみ項目を追加できます。

String item = matcher.group(groupIndex).trim();
if (!item.isEmpty()) {
    ls.add(item);
}
于 2013-03-04T12:57:30.463 に答える
0

引用符が文字列の一部でない場合は、splitString のメソッドを使用できます。

String input = "item1; item2; item3";
List<String> list = Arrays.asList(input.split("; ");
于 2013-03-04T12:59:44.280 に答える
0

空の文字列または matcher.start/end が等しいかのいずれかでフィルタリングできます。

于 2013-03-04T12:59:50.367 に答える