从字符串的末尾获取整数(可变长度)
我有一个可变长度的字符串,在字符串的末尾是一些数字。 什么是最好/最有效的方法,解析字符串并从最终获得数字作为整数?
字符串和末尾的数字可以是任意长度。 例如:
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; }