2013-06-21 41 views
2

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

1234 - >号:[1234],名称:[]

1234,34,234 - >号:[1234,34,234],名称:[]

12,FOO,123 - >号:[12,123],名称:[富]

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

foo,bar - > - > numbers:[],name:[foo,bar]

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

+0

您可以使用OR和组:'(\ d +)|([a-zA-Z] +)'[demo](http://regex101.com/r/yB0iS6) – HamZa

+1

也可以使用命名组有趣的是,因为我不是一个Java开发人员,请看看这个[回答](http://stackoverflow.com/a/415635/) – HamZa

回答

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 
+0

为什么不只是'\ d + | [^,] +'?不需要捕获组,那么匹配器的'.group()'将返回所需值 – fge

+0

您忘记排除空格:p – HamZa

+0

@fge:因为这样,您知道匹配是数字还是非数字 –

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

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