如何从ra12ke43sh56这样的字符串中获取最后一个整数"56“?
我必须将下一个值修改为ra12ke43sh57,所以我希望获得最后一个整数值。
发布于 2010-06-21 16:50:57
StringBuilder sb = new StringBuilder();
for (int i = str.length() - 1; i >= 0; i --) {
char c = str.charAt(i);
if (Character.isDigit(c)) {
sb.insert(0, c);
} else {
break;
}
}
String result = sb.toString();
或
Pattern p = Pattern.compile("[0-9]+$");
Matcher m = p.matcher(str);
if(m.find()) {
result = m.group();
}
然后是Integer.parseInt(result)
发布于 2010-06-23 17:23:05
也许这就是您想要的(see also on ideone.com):
static String nextId(String id) {
String[] parts = id.split("(?=\\d+$)", 2);
final int L = parts[1].length();
final int num = Integer.parseInt(parts[1]) + 1;
return parts[0] + String.format("%0"+L+"d", num);
}
public static void main(String[] args) {
String[] tests = {
"jamesBond007", "ra12ke43sh57", "-42", "x888y999", "00000"
};
for (String test : tests) {
System.out.println(nextId(test));
}
// prints "jamesBond008", "ra12ke43sh58", "-43", "x888y1000", "00001"
}
它是如何工作的
这里有几件事在起作用:
parts[0]
是静态前缀,emptyparts[1]
可能是string末尾的数字序列,使用String.split(String regex, int limit)
的
数字字符使用零宽度匹配正向匹配来拆分字符,匹配的位置可以匹配数字字符类,即
(?=\d+$)
\d
+
$
的末尾
使用String.format
保留所有前导零的十进制整数宽度类似于宽度的格式表示:
0
:zeroes5
:5d
is conversion:
String.format
:%05d
相关问题
在lookarounds上:
参考文献
发布于 2010-06-24 21:11:26
这不是一个答案,只是要提到,在最坏的情况下,“显而易见的”正则表达式(如上所述)具有令人讨厌的二次行为(我非常确定您不会处理这种退化的情况,但它本身很有趣)。
这是我准备的一个小图表:alt text http://img517.imageshack.us/img517/1158/imageerp.jpg
我使用了形式为"111..1111a2“的字符串,其中有”1“的J
实例。
性能不佳的原因很明显:匹配器总是看到1,并且很高兴地认为它会成功,只有当它找到接近尾部的a
时,它才发现a
与$
不匹配,所以它一直返回,并从第二个字符开始。
最初,我认为所有格量词在这里会有所帮助,但它看起来并不直接。即使我编写了\d++
,如果我调用matcher.find(),它仍然会尝试从每个索引开始匹配模式,也就是说,外部循环不会从先前的后置量词失败中得到任何提示。(注意,这个问题不会影响Matcher.matches(),因为它只尝试在单个索引,即开始处进行匹配)。
在这个特定的问题中,为了避免这种行为,我们必须反转字符串并使用简单的^\\d+
模式进行搜索,或者向后迭代字符并进行手动匹配。
https://stackoverflow.com/questions/3083154
复制相似问题