【问题标题】:Extract substring from end till first alphabet in java在java中从末尾提取子字符串直到第一个字母
【发布时间】:2016-07-10 16:11:08
【问题描述】:

我有一串格式:A-2-Q4567

更多示例:AB-456-T12、A24-5-M12345 等

我想从这些字符串中提取最后一个数值,分别是:4567、12、12345(这是子字符串从末尾到遇到第一个非数字字符的数值)

我可以拆分字符串,从拆分后的字符串数组中获取最后一个字符串,然后在从中删除非数字字符后执行 parseInt。

但是有没有更优雅的方法呢?

【问题讨论】:

    标签: java string substr


    【解决方案1】:

    您可以使用此regex(\d+$)。它返回字符串中的最后一个数字序列。

    编辑 - 一些解释:
    \d 表示任何数字。
    + 表示前面的一个或多个符号。由于前一个符号是数字,所以\d+ 表示“一个或多个数字”。
    $ 表示字符串的结尾,因此\d+$ 是字符串中最后的数字序列。

    【讨论】:

    • 不错的答案,但更多解释会很好(例如,控制字符 \d+$ 是什么)
    【解决方案2】:

    你可以这样做:

    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 "";
    

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 2020-02-02
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多