我正在使用以下格式的逗号分隔字符串:
String codeList1 = "abc,pqr,100101,P101001,R108972";
或
String codeList2 = "mno, 100101,108972";
预期结果:删除第一个字母后,检查代码是否为数字。如果是,请删除前缀并返回。如果否,则仍返回代码。
codeList1 = "abc,pqr,100101,101001,108972";
或
codeList2 = "mno, 100101,108972";
如您所见,我可以获得代码(P101001或101001)和(R108972,108972)格式。只会有一个前缀。
如果我收到(P101001),我想删除'P'前缀并返回数字101001。
如果我收到101001,什么也不做。
下面是工作代码。但是,有没有更简单或更有效的方法来实现这一目标。请帮助
for (String code : codeList.split(",")) {
if(StringUtils.isNumeric(code)) {
codes.add(code);
} else if(StringUtils.isNumeric(code.substring(1))) {
codes.add(Integer.toString(Integer.parseInt(code.substring(1))));
} else {
codes.add(code);
}
}
答案 0 :(得分:2)
如果要从数字中删除前缀,可以方便地使用:
String[] codes = {"abc,pqr,100101,P101001,R108972", "mno, 100101,108972"};
for (String code : codes){
System.out.println(
code.replaceAll("\\b[A-Z](\\d+)\\b", "$1")
);
}
输出
abc,pqr,100101,101001,108972
mno, 100101,108972
如果您使用的是Java 8+,并且只想提取数字,则可以使用:
String codeList1 = "abc,pqr,100101,P101001,R108972";
List<Integer> results = Arrays.stream(codeList1.split("\\D")) //split with non degits
.filter(c -> !c.isEmpty()) //get only non empty results
.map(Integer::valueOf) //convert string to Integer
.collect(Collectors.toList()); //collect to results to list
输出
100101
101001
108972
答案 1 :(得分:2)
您可以使用regex
来完成
String str = "abc,pqr,100101,P101001,R108972";
String regex = ",?[a-zA-Z]{0,}(\\d+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
System.out.println(matcher.group(1));
}
输出
100101
101001
108972
更新:
对于您的评论(我要添加代码。如果找到单个字母前缀,请将其删除并添加剩余的),您可以使用以下代码:
String str = "abc,pqr,100101,P101001,R108972";
String regex = "(?=,?)[a-zA-Z]{0,}(?=\\d+)|\\s";// \\s is used to remove space
String[] strs = str.replaceAll(regex,"").split(",");
输出:
abc
pqr
100101
101001
108972
答案 2 :(得分:1)
如何?
String codeList1 = "abc,pqr,100101,P101001,R108972";
String[] codes = codeList1.split(",");
for (String code : codes) {
if (code.matches("[A-Z]?\\d{6}")) {
String codeF = code.replaceAll("[A-Z]+", "");
System.out.println(codeF);
}
}
100101
101001
108972