如何从字符串中获取最后一个整数“56”,如ra12ke43sh56?

时间:2010-06-21 08:45:08

标签: java

如何从字符串中获取最后一个整数“56”,如ra12ke43sh56?

我必须将下一个值修改为ra12ke43sh57,所以我想得到最后一个整数值。

6 个答案:

答案 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());

如果strra12ke43sh56,则可以降低这一点:

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();
}