从字符串中提取数字 - StringUtils Java

104

我有一个字符串,想要提取其中唯一的数字序列。

例如: helloThisIsA1234Sample. 我想要的是 1234

可以确定数字序列在字符串中只出现一次,但位置不同。

(对于那些会问的人,我有一个服务器名称,需要从中提取特定的数字)

我想使用Apache commomns中的StringUtils类。

谢谢!


1
Apache StringUtils。不过我不确定你为什么想要使用它。 - Rahul
这就是我拥有的,想知道是否已经有一个函数可以做我需要的事情,但我对它不是很熟悉。 - NinaNa
因为当你可以使用String本身完成时,你就不需要来自Apache的StringUtils - Rahul
19个回答

206

使用这段代码,numberOnly 将包含您想要的输出。

   String str="sdfvsdf68fsdfsf8999fsdf09";
   String numberOnly= str.replaceAll("[^0-9]", "");

5
String.replaceAll() 方法每次运行时都会编译一次模式,这非常不优化。请检查其源代码。使用Guava的CharMathcer.DIGIT.retainFrom()方法,如下所示。 - Agoston Horvath
1
在更近的Java版本中,正则表达式可以简化为"\D"。 - CeePlusPlus
1
在最新的Java版本中,正则表达式可以简化为"\D"。 - undefined

39

我总是喜欢使用Guava 字符串工具或类似的工具来处理这类问题:

String theDigits = CharMatcher.inRange('0', '9').retainFrom("abc12 3def"); // 123

5
这比正则表达式快得多。这应该是被接受的答案。 - Agoston Horvath
2
请使用 CharMatcher.digit().retainFrom("xx123xx"); 替代 DIGIT,因为 DIGIT 将于2018年6月被移除。 - Scott 混合理论
3
CharMather.digit()也已被弃用。我使用CharMatcher.inRange('0', '9').retainFrom("xx123xx"); - lamyarus

28

只有一行:

int value = Integer.parseInt(string.replaceAll("[^0-9]", ""));

13

你还可以使用java.util.Scanner

new Scanner(str).useDelimiter("[^\\d]+").nextInt()

你可以使用next()代替nextInt(),将数字作为String获取。注意,在结果上调用Integer.parseInt可能比调用nextInt()多次

您可以使用Scanner上的hasNextInt()检查数字是否存在。


在更近的Java版本中,正则表达式可以简化为"\D"。 - CeePlusPlus

7

使用正则表达式,例如[^0-9],可以删除所有非数字字符。

然后,只需使用Integer.parseInt(String);即可。


听起来很有趣,你能给我更多的代码吗?假设我的字符串变量名叫做 myString,我该怎么用它?(我对Java还是有点陌生的...) - NinaNa

5

尝试这个:

String s = "helloThisIsA1234Sample";
s = s.replaceAll("\\D+","");

这意味着:将所有数字字符(0-9)的出现替换为空字符串!

1
如果你能添加一点关于你的代码所做的事情的解释,那就太好了。 :) - Bhargav Rao

4

Guava的CharMatcher类可以从String中提取Integer

String text="Hello1010";
System.out.println(CharMatcher.digit().retainFrom(text));

产生:

1010

自2022年起已被弃用 - Sebastian Nielsen

4

扩展找到浮点数的最佳答案

       String str="2.53GHz";
       String decimal_values= str.replaceAll("[^0-9\\.]", "");
       System.out.println(decimal_values);

3

如果您可以访问org.apache.commons.lang3,您可以使用StringUtils.getDigits方法。

public static void main(String[] args) {
    String value = "helloThisIsA1234Sample";
    System.out.println(StringUtils.getDigits(value));
}
output: 12345

3

我已经为同一个问题创建了一个JUnit测试类(作为额外的知识/信息)。希望这对你有帮助。

   public class StringHelper {
    //Separate words from String which has gigits
        public String drawDigitsFromString(String strValue){
            String str = strValue.trim();
            String digits="";
            for (int i = 0; i < str.length(); i++) {
                char chrs = str.charAt(i);              
                if (Character.isDigit(chrs))
                    digits = digits+chrs;
            }
            return digits;
        }
    }

一个JUnit测试案例如下:

 public class StringHelperTest {
    StringHelper helper;

        @Before
        public void before(){
            helper = new StringHelper();
        }

        @Test
    public void testDrawDigitsFromString(){
        assertEquals("187111", helper.drawDigitsFromString("TCS187TCS111"));
    }
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接