3

我试图在字符串、整数和特殊字符之间进行拆分,我尝试了一些方法,但对我不起作用,所以有什么想法吗?

源代码:

    String a = "abc1_xyz1";

        String[] qq = a.split("(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)|('_')");

        for(int i=0; i<qq.length; i++){
            System.out.println(qq[i] + " \n");
        }

我的期望输出是:

abc
1
_
xyz
1

但我得到的是:

abc
1
_xyz
1

这里有人可以给我指导吗?

4

4 回答 4

3

你有几个小问题。\D 将匹配 _ 并且您不希望在您的代码中如此 此外,拆分 _ 会将其从输出中排除。

这段代码可以工作

    String a = "abc1_xyz1";

    for (String s : a.split("" +
        "(?<=[a-z])(?=\\d)" +    // space between letter and digit
        "|(?<=\\d)(?=[a-z])" +   // space between digit and letter
        "|(?<=_)(?=\\d)" +       // space between _ and digit
        "|(?<=\\d)(?=_)" +       // space between digit and _
        "|(?<=_)(?=[a-z])" +     // space between _ and letter
        "|(?<=[a-z])(?=_)" +     // space between letter and _
        "")) {
        System.out.println(s);
    }
于 2013-04-11T08:35:09.677 回答
2

我认为这split()是错误的方法,因为您实际上没有任何分隔符并且想要使用拆分的所有内容(它会在值之间为您提供空行)。

相反,假设表达式是常规的,我会使用Pattern.compile()and Matcher.group(),因此:

    String a = "abc1_xyz1";
    Pattern p = Pattern.compile("(\\D+)(\\d+)(_)(\\D+)(\\d+)");
    Matcher m = p.matcher(a);
    if (m.find()) {
        for (int i = 1; i<=m.groupCount();i++) {
            System.out.println(m.group(i));
        }
    }

如果任何组是可选的,您可以在其后添加一个问号(然后该组将为空)。

于 2013-04-11T08:39:41.397 回答
1

另一种解决方案:_在检查数字/非数字边界之前检查:

String[] qq = a.split("(_)|(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)");
于 2013-04-11T08:48:46.237 回答
0

根据文档Pattern \D是“非数字”。_是非数字,因此将被匹配。

尝试用(匹配任何 ASCII 字母)或(匹配任何 Unicode 字母)替换\D您的代码。\p{Alpha}\p{L}

于 2013-04-11T08:33:23.370 回答