首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何从ra12ke43sh56这样的字符串中获取最后一个整数"56“?

如何从ra12ke43sh56这样的字符串中获取最后一个整数"56“?
EN

Stack Overflow用户
提问于 2010-06-21 16:45:08
回答 6查看 10.5K关注 0票数 8

如何从ra12ke43sh56这样的字符串中获取最后一个整数"56“?

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

EN

回答 6

Stack Overflow用户

发布于 2010-06-21 16:50:57

代码语言:javascript
代码运行次数:0
运行
复制
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();

代码语言:javascript
代码运行次数:0
运行
复制
Pattern p = Pattern.compile("[0-9]+$");
Matcher m = p.matcher(str);
if(m.find()) {
    result = m.group();
}

然后是Integer.parseInt(result)

票数 24
EN

Stack Overflow用户

发布于 2010-06-23 17:23:05

也许这就是您想要的(see also on ideone.com):

代码语言:javascript
代码运行次数:0
运行
复制
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]是静态前缀,empty
  • parts[1]可能是string

末尾的数字序列,使用String.split(String regex, int limit)

  • 限制为2个部分

数字字符使用零宽度匹配正向匹配来拆分字符,匹配的位置可以匹配数字字符类,即

  • (?=\d+$)
    • \d
    • ...重复一次或多次+
    • ...直到字符串锚$

的末尾

使用String.format保留所有前导零的十进制整数宽度类似于宽度的格式表示:

  • 0:zeroes
  • 5:5
  • d is conversion

相关问题

在lookarounds上:

参考文献

票数 4
EN

Stack Overflow用户

发布于 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+模式进行搜索,或者向后迭代字符并进行手动匹配。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3083154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档