2

我的目标是从 java 中的字符串中提取名称和数字。示例:输入 -> 输出

1234 -> 数字:[1234],名称:[]

1234,34,234 -> 数字:[1234,34,234],名称:[]

12,foo,123 -> 数字:[12, 123],名称:[foo]

foo3,1234,4bar,12,12foo34 -> 数字:[1234, 12],名称:[foo3, 4bar, 12foo34]

foo,bar -> -> 数字:[],名称:[foo, bar]

我想出了[^,]+(,?!,+)*匹配字符串的所有部分,但我不知道如何只匹配数字或名称(名称可以包含数字 - 如示例所示)。谢谢

4

3 回答 3

6

这是一个仅限正则表达式的解决方案:

(?:(\d+)|([^,]+))(?=,|$)

第一组(\d+)捕获数字,第二组([^,]+)捕获其余部分。组必须后跟逗号或行尾(?=,|$)

快速演示:

Pattern p = Pattern.compile("(?:(\\d+)|([^,]+))(?=,|$)");
Matcher m = p.matcher("foo3,1234,4bar,12,12foo34");

while (m.find()) {
    System.out.println(m.group(1) != null 
        ? "Number: " + m.group(1)  
        : "Non-Number: " + m.group(2));
}

输出:

Non-Number: foo3
Number: 1234
Non-Number: 4bar
Number: 12
Non-Number: 12foo34
于 2013-06-21T09:35:50.157 回答
2

您可以使用扫描仪

Scanner sc = new Scanner(input);
sc.useDelimiter(",");
while(sc.hasNext()) {
    if(sc.hasNextInt()) {
        int readInt = sc.nextInt();
        // do something with the int
    } else {
        String readString = sc.next();
        // do something with the String
    }
}
于 2013-06-21T09:36:46.910 回答
1

干得好:

        String a = "abc,123,abs12,12ab";
        ArrayList<String> numbers = new ArrayList<>();
        ArrayList<String> letters = new ArrayList<>();
        String ar[] = (a.split(","));
        for (String string : ar) {
            try{
                Long.parseLong(string);
                numbers.add(string);
            }catch(NumberFormatException ex){
                letters.add(string);
            }
        }

上述解决方案处理整数位可以位于字符串中任何位置的情况。不仅在开头或结尾。

于 2013-06-21T09:41:48.823 回答