从字符串中提取数字和名称

时间:2013-06-21 09:31:35

标签: java regex

我的目标是从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]

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

3 个答案:

答案 0 :(得分:5)

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

(?:(\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

答案 1 :(得分:2)

您可以使用Scanner

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
    }
}

答案 2 :(得分: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);
            }
        }

上面的解决方案处理整数位可以在字符串中的任何位置的情况。不仅在开始或结束时。