如何从字符串中获取最后一个整数“56”,如ra12ke43sh56?
我必须将下一个值修改为ra12ke43sh57,所以我想得到最后一个整数值。
答案 0 :(得分:22)
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)
答案 1 :(得分:4)
也许这样的事情就是你想要的(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"
}
这里有几件事情可以解决:
String.split(String regex, int limit)
,限于2个部分
parts[0]
是静态前缀,可能为空parts[1]
是字符串末尾的数字序列(?=\d+$)
匹配您可以匹配\d+$
的位置
\d
字符类+
$
String.format
保留任何前导零
%05d
之类的格式表示:
0
:使用前导零填充5
:宽度为5 d
:十进制整数转换在外观上:
答案 2 :(得分:2)
不是答案,只是提到这个“明显的”正则表达式(如上所述)在最坏的情况下有一个令人讨厌的二次行为(我很确定你不会处理这种退化的情况,但是它自己很有意思。)
这是我准备的一个小图: alt text http://img517.imageshack.us/img517/1158/imageerp.jpg
我使用了“111..1111a2”形式的字符串
J
次出现'1'。
性能不佳的原因很明显:匹配器一直看到1并且很高兴地认为它会成功,并且只有当它发现a
几乎结束时它才发现a
不匹配$
,所以它一直回来,从第二个角色开始。
最初我认为占有量词会在这里有所帮助,但它看起来并不直截了当。即使我写\d++
,如果我调用matcher.find(),它仍然会尝试匹配从每个索引开始的模式,即外部循环不会从之前的失败中提示积极的量词。 (注意,此问题不会影响Matcher.matches(),因为它只会尝试匹配单个索引,即开始)。
在这个特殊问题中,为了避免这种行为,我们必须反转字符串并使用简单的^\\d+
模式进行搜索,或者向后迭代字符并进行手动匹配。
答案 3 :(得分:1)
String result = str.substring(str.replaceAll("[0-9]+$","").length());
如果str
为ra12ke43sh56
,则可以降低这一点:
str.replaceAll("[0-9]+$","")
返回除最后一组数字外的所有数字,即ra12ke43sh
substring
在主字符串上的长度仅返回结尾数字,即56。
答案 4 :(得分:0)
public class PrefixId {
public String getTransactionNumber() {
String prevNumber = "123abc321";
String incredNumber = "";
for (int i = prevNumber.length() - 1; i >= 0; i--) {
char ch = prevNumber.charAt(i);
if (incredNumber.length() > 0 && !Character.isDigit(ch)) {
break;
} else if (Character.isDigit(ch)) {
incredNumber = incredNumber + ch;
}
}
if (incredNumber.length() > 0) {
incredNumber = new StringBuffer(incredNumber).reverse().toString();
prevNumber = prevNumber.replace(incredNumber, ""
+ (Long.parseLong(incredNumber) + 1));
}
return prevNumber;
}
public static void main(String[] args) {
PrefixId prefixId = new PrefixId();
System.out.println(prefixId.getTransactionNumber());
}
}
答案 5 :(得分:0)
public static String getLastDigits(String string) {
String reverseTaskId = new StringBuilder(string).reverse().toString();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < reverseTaskId.length(); i++) {
if (Character.isDigit(reverseTaskId.charAt(i))) {
sb.insert(i, reverseTaskId.charAt(i));
} else {
break;
}
}
return sb.reverse().toString();
}