如何在Java中从字符串中删除非数字字符?

64

我有一个长字符串。如何用正则表达式将其中的数字拆分为数组?


2
  1. 发布一个字符串示例
  2. 是一个字符串还是一个数组或者一个字符串数组(String[])?
  3. 你想要什么?只是从一个字符串中删除非数字字符,还是将其删除并获取包含数字的数组?
- eveliotc
3
请将此问题表达更清晰。以下是一些提示:展示字符串输入和字符串输出。重新措辞第二个句子以使其更加解释性。你是否有由非数字分隔的多个数字?或者每个数字都应该被拆分? - Eric Normand
请看一下[https://regexr.com/]。您可以尝试任何正则表达式,并查看每个部分的分解,通过在该网站上玩弄不同的正则表达式,您还可以“自学”如何使用和处理正则表达式。希望能有所帮助。干杯! - Bahman.A
10个回答

148
你是在删除还是拆分?这会删除所有非数字字符。
myStr = myStr.replaceAll( "[^\\d]", "" )

5
myStr = myStr.replaceAll("[\\D]", ""); - Jonas Fagundes
16
使用正则表达式s/\\D+//替换字符串中的非数字字符,更易读。 - Adil

30

从字符串中删除所有非数字字符的另一种方法:

String newString = oldString.replaceAll("[^0-9]", "");

20
String str= "somestring";
String[] values = str.split("\\D+"); 

你的答案相比其他所有答案都是最好的。直截了当。 - Jenna Leaf

15

另一个正则表达式的解决方案:

string.replace(/\D/g,'');  //remove the non-Numeric

同样地,您可以

string.replace(/\W/g,'');  //remove the non-alphaNumeric

在正则表达式中,“\”符号会将其后面的字母作为模板: \w -- 表示包含字母和数字,\W -- 表示不包含字母和数字。当你将字母大写时,意义将被取反。


1
是的,这是JavaScript代码,不是JAVA。eveliotc的答案是用JAVA编写的。(请看下面几个答案) - Jenna Leaf

8
你需要使用字符串类的Split()方法,并传入一个正则表达式"\D+",该表达式将匹配至少一个非数字字符。
myString.split("\\D+");

这将移除所有的数字字符,并返回一个包含所有非数字字符的数组。这与所请求的完全相反。 - tangens
1
哎呀,我一定误解了问题的意思。在这种情况下,它将是正则表达式的否定版本,即\D+。我会更新我的答案! - Stephen Mesa

3

Java 8 集合流 :

StringBuilder sb = new StringBuilder();
test.chars().mapToObj(i -> (char) i).filter(Character::isDigit).forEach(sb::append);
System.out.println(sb.toString());

2

这在Flex SDK 4.14.0中有效。

myString.replace(/[^0-9&&^.]/g, "");

可以将字符串中除数字、&和.之外的字符替换为空。

1
你可以使用下面这样的递归方法:
public static String getAllNumbersFromString(String input) {
        if (input == null || input.length() == 0) {
            return "";
        }
        char c = input.charAt(input.length() - 1);
        String newinput = input.substring(0, input.length() - 1);

            if (c >= '0' && c<= '9') {
            return getAllNumbersFromString(newinput) + c;

        } else {
            return getAllNumbersFromString(newinput);
        }
    } 

练习使用“递归”是一个很好的锻炼。但在现实世界(编程世界)中,程序员会使用正则表达式!正则表达式已经存在了半个世纪。 - Jenna Leaf

1

之前的答案会去掉你的小数点。如果你想保留小数,你可能需要

String str = "My values are : 900.00, 700.00, 650.50";

String[] values = str.split("[^\\d.?\\d]"); 
// split on wherever they are not digits except the '.' decimal point
// values: { "900.00", "700.00", "650.50"}  

为什么在字符类中两次使用 \\d[^\\d.?\\d] 是一个否定的字符类,匹配任何不是数字、点或问号的字符。 - Toto
Toto,我的解决方案旨在保留类似于"900.50"这样的值中的小数点--您不希望将它们拆分为{"900", "50"}。 - Jenna Leaf
1
那么 [^\\d.] 就足够了,而且实现的效果也一样。 - Toto

0

不使用正则表达式的简单方法:

public static String getOnlyNumerics(String str) {
    if (str == null) {
        return null;
    }
    StringBuffer strBuff = new StringBuffer();
    char c;
    for (int i = 0; i < str.length() ; i++) {
        c = str.charAt(i);
        if (Character.isDigit(c)) {
            strBuff.append(c);
        }
    }
    return strBuff.toString();
}

1
你的代码不够简单!你应该使用正则表达式。正则表达式是一个强大的工具,可以简化很多代码,你需要掌握并使用它。 - Jenna Leaf

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