【发布时间】:2016-07-10 16:11:08
【问题描述】:
我有一串格式:A-2-Q4567
更多示例:AB-456-T12、A24-5-M12345 等
我想从这些字符串中提取最后一个数值,分别是:4567、12、12345(这是子字符串从末尾到遇到第一个非数字字符的数值)
我可以拆分字符串,从拆分后的字符串数组中获取最后一个字符串,然后在从中删除非数字字符后执行 parseInt。
但是有没有更优雅的方法呢?
【问题讨论】:
我有一串格式:A-2-Q4567
更多示例:AB-456-T12、A24-5-M12345 等
我想从这些字符串中提取最后一个数值,分别是:4567、12、12345(这是子字符串从末尾到遇到第一个非数字字符的数值)
我可以拆分字符串,从拆分后的字符串数组中获取最后一个字符串,然后在从中删除非数字字符后执行 parseInt。
但是有没有更优雅的方法呢?
【问题讨论】:
您可以使用此regex:(\d+$)。它返回字符串中的最后一个数字序列。
编辑 - 一些解释:\d 表示任何数字。+ 表示前面的一个或多个符号。由于前一个符号是数字,所以\d+ 表示“一个或多个数字”。$ 表示字符串的结尾,因此\d+$ 是字符串中最后的数字序列。
【讨论】:
\d、+ 和 $ 是什么)
你可以这样做:
String getLastNumeric(String input)
{
String str="";
char c;
for(int i=input.length()-1;i>=0 && Character.isDigit(c=input.charAt(i));i--)
str=c+str;
return str;
}
正则表达式解决方案可能更优雅,但在性能方面我认为上面是最好的,因为正则表达式匹配可能比具有简单评估条件的简单 for 循环更昂贵。
当然,Regex 更加灵活,如果您的要求发生变化,并且现在必须在数字前加上破折号“-”怎么办?使用正则表达式应该只是改变一个正则表达式的问题。
我将正则表达式版本放在这里,但请记住,如果您确定您的要求不会改变,我认为上述解决方案在 CPU 上更好:
Matcher matcher= Pattern.compile("(\\d+$)").matcher(input);
if(matcher.find())
return matcher.group();
return "";
【讨论】: