从字符串的末尾获取整数(可变长度)

我有一个可变长度的字符串,在字符串的末尾是一些数字。 什么是最好/最有效的方法,解析字符串并从最终获得数字作为整数?

字符串和末尾的数字可以是任意长度。 例如:

 abcd123  - > 123
 abc12345  - > 12345
 ab4cd1  - > 1

沿线的东西:

final static Pattern lastIntPattern = Pattern.compile("[^0-9]+([0-9]+)$"); String input = "..."; Matcher matcher = lastIntPattern.matcher(input); if (matcher.find()) { String someNumberStr = matcher.group(1); int lastNumberInt = Integer.parseInt(someNumberStr); } 

能做到这。

这不是“最有效”方式所必需的,但除非你有一个围绕这个代码的关键瓶颈(如:从数百万字符串中提取int),这应该就足够了。

这里提供的其他解决方案都很好,所以我将提供这个解决方案有点不同:

 public static BigInteger lastBigInteger(String s) { int i = s.length(); while (i > 0 && Character.isDigit(s.charAt(i - 1))) { i--; } return new BigInteger(s.substring(i)); } 
  • 它手动查找最后一个非Character.isDigit(char)
    • 如果输入全部为数字,它仍然有效
  • 它使用BigInteger ,因此它可以在非常长的字符串末尾处理非常大的数字。
    • 如果两者都满足,请使用Integer.parseInt或Long.parseLong

最好的是这样一个主观术语:-)除非你打算做这么多(在这种情况下表现可能优先于可读性),我只是采取我的第一个直觉:

 int n = 0; try { n = Integer.parseInt (str.replaceFirst("^.*\\D","")); } catch (Exception e) {} 
 int getTrailingInteger(String str) { int positionOfLastDigit = getPositionOfLastDigit(str); if (positionOfLastDigit == str.length()) { // string does not end in digits return -1; } return Integer.parseInt(str.substring(positionOfLastDigit)); } int getPositionOfLastDigit(String str) { int pos; for (pos=str.length()-1; pos>=0; --pos) { char c = str.charAt(pos); if (!Character.isDigit(c)) break; } return pos + 1; } 

没有正则表达式我会这样做!

看看我的更新!

 public static int getLastInt(String line) { int offset = line.length(); for (int i = line.length() - 1; i >= 0; i--) { char c = line.charAt(i); if (Character.isDigit(c)) { offset--; } else { if (offset == line.length()) { // No int at the end return Integer.MIN_VALUE; } return Integer.parseInt(line.substring(offset)); } } return Integer.parseInt(line.substring(offset)); } 

这很完美。

已经有很多好的答案,我只是想给我两分钱。

我知道在循环中运行parseInt()不是一种有效的方法,但为了简单起见

 for (int a = 0; a < string.length(); a++) try { int result = Integer.parseInt(string.substring(a)); break; } catch (Exception e) {} 

针对其他答案进行测试:

我已经针对接受的答案运行了一些测试,这段代码的运行速度提高了7到10倍 。 即使字符串是页长,此代码运行速度提高3到4倍

然后我尝试了第二个最受欢迎的答案 ,这个代码运行速度提高了3到4倍 。 但是当字符串长度很长时,运行速度会变慢

然后我试着反对Martijn的回答 。 没有进一步评论。 ;-(

遍历每个字符以查找非数字字符。 当发现一个人在它之前切断它和一切。 循环运行后,将结果转换为int。

一般来说,我更喜欢清晰和简短的代码,但如果性能确实是您的首要任务,请考虑以下内容:

 private static int getNum(String s){ int res = 0; int p = 1; int i = s.length()-1; while(i >= 0){ int d = s.charAt(i) - '0'; if (d>=0 && d<=9) res += d * p; else break; i--; p *= 10; } return res; } 

它不使用任何复杂的字符串/正则表达式操作。 但同样 - 如果性能不是问题,请使用上面介绍的其他技术。

 public int getIntFromEndOfString(String inpStr){ int revVal = 0; boolean flag = false; String reverseNo = "", result = ""; for (int i = inpStr.length()-1; i >= 0 ; i--) { reverseNo = String.valueOf(inpStr.charAt(i)); if(!flag) if(reverseNo.equals("0") ||reverseNo.equals("1") || reverseNo.equals("2") || reverseNo.equals("3") | reverseNo.equals("4") || reverseNo.equals("5") || reverseNo.equals("6") || reverseNo.equals("7") || reverseNo.equals("8") || reverseNo.equals("9")){ revVal = Integer.parseInt(reverseNo); result+= String.valueOf(revVal); }else{ inpStr = result; i = inpStr.length(); flag = true; result = ""; }else{ result += reverseNo; } } revVal = Integer.parseInt(result); return revVal; } 
 private int intAtEnd(String string) { int i, j; i = j = string.length(); while (--i > 0) { if (Character.isDigit(string.charAt(i))) continue; i++; break; } if (j - i > 1) return Integer.parseInt(string.substring(i)); return -1; }