0

简单的问题 - 可能 - 但我找不到没有解决方法的解决方案。

我想解析某事。喜欢

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

如果引号不是您的字符串的一部分,您可以split在 String 上使用该方法:

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 回答