2013-06-21 42 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); 
      } 
     } 

以上解決方案處理整數位可以位於字符串中任何位置的情況。不僅在開始或結束時。