我的目标是从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]
我提出了匹配字符串所有部分的[^,]+(,?!,+)*
,但我不知道如何仅匹配数字或名称(名称可以包含数字 - 如示例中所示)。
感谢
答案 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);
}
}
上面的解决方案处理整数位可以在字符串中的任何位置的情况。不仅在开始或结束时。