如何在Java中从输入字符串中提取数字值

13

如何从输入字符串中提取数字值?

例如,输入字符串可能是这样的:

String str="abc d 1234567890pqr 54897";

我只想要数字值,例如"1234567890""54897"。所有的字母和特殊字符都将被丢弃。


所有的字母都将被舍弃 - 您的意思是 - codingbiz
我只想要那些数字。 - smya.dsh
我什么都没试过,因为我完全一无所知。数字值可能在输入的开头或结尾。 - smya.dsh
16个回答

23
你可以使用Scanner类中的.nextInt()方法:

将输入的下一个标记扫描为int。

另外,你也可以这样做:
String str=" abc d 1234567890pqr 54897";

Pattern p = Pattern.compile("(\\d+)");
Matcher m = p.matcher(str);
while(m.find())
{
    System.out.println(m.group(1));
}

是的,但是模式不固定。我的意思是并不总是紧跟着字母"d"后面才会有数字。 - smya.dsh
1
@smya.dsh:我不明白你最新的评论。\\d+ 表示正则表达式语言中的一位或多位数字,与字母 d 没有关系(至少在这种情况下是这样)。 - npinti

14
String str=" abc d 1234567890pqr 54897";
Pattern pattern = Pattern.compile("\\w+([0-9]+)\\w+([0-9]+)");
Matcher matcher = pattern.matcher(str);
for(int i = 0 ; i < matcher.groupCount(); i++) {
  matcher.find();
  System.out.println(matcher.group());
}

8

使用yourString.toCharArray();将您的字符串分割为字符数组,然后遍历这些字符并使用Character.isDigit(ch);来确定它是否是数字值。或者遍历整个字符串并使用str.charAt(i)。例如:

public static void main(String[] args) {
    String str = "abc d 1234567890pqr 54897";
    StringBuilder myNumbers = new StringBuilder();
    for (int i = 0; i < str.length(); i++) {
        if (Character.isDigit(str.charAt(i))) {
            myNumbers.append(str.charAt(i));
            System.out.println(str.charAt(i) + " is a digit.");
        } else {
            System.out.println(str.charAt(i) + " not a digit.");
        }
    }
    System.out.println("Your numbers: " + myNumbers.toString());
}

5
你可以这样做:

你可以尝试以下方法:

Matcher m = Pattern.compile("\\d+").matcher(str);
while (m.find()) {
   System.out.println(m.group(0));
}

2

如果您不想使用正则表达式,

String str = " abc d 1234567890pqr 54897";

char[] chars = new char[str.length()];

int i = 0;
for (int j = 0; j < str.length(); j++) {
    char c = str.charAt(j);
    if (Character.isDigit(c)) {
        chars[i++] = c;
        if (j != chars.length - 1)
            continue;
    }
    if (chars[0] == '\0')
        continue;
    String num = new String(chars).trim();
    System.out.println(num);
    chars = new char[str.length()];
    i = 0;

}

Output : 1234567890 54897


2
你想要抛弃除数字和空格以外的所有内容:
String nums = input.replaceAll("[^0-9 ]", "").replaceAll(" +", " ").trim();

额外的调用可以清除重复和前导/尾随空格。
如果您需要一个数组,请添加分割符:
String[] nums = input.replaceAll("[^0-9 ]", "").trim().split(" +");

String nums = input.replaceAll("[0-9 ]", "") 只会丢弃数字吗? - fade2black
@fade2black 在字符类中也有一个空格字符,位于 9] 之间,但感谢您的信息:我刚刚注意到我漏掉了否定符号 ^。现在代码应该可以工作了。 - Bohemian
我的观点是你应该从原始字符串中删除所有数字。你刚刚通过添加'^'进行了编辑。你之前的正则表达式是错误的。它删除了所有数字和空格,而OP要求相反的操作。 - fade2black
1
@fade 是的,我已经修复了我的错误,所以感谢你提醒我。 - Bohemian

2
        String line = "This order was32354 placed 343434for 43411 QT ! OK?";
        String regex = "[^\\d]+";

        String[] str = line.split(regex);
        String required = "";
        for(String st: str){
            System.out.println(st);
        }

通过上面的代码,您将获得所有数字值。然后,您可以合并它们或者对这些数字值进行任何想要的操作。

从一个长的字母数字字符串中提取数字的方法非常简单。 - UzumakiL

2
你可以使用str = str.replaceAll("被替换的字符串","替换成的字符串");
String str=" abc d 1234567890pqr 54897";
String str_rep1=" abc d ";
String str_rep2="pqr ";
String result1=str.replaceAll("", str_rep1);
String result2=str.replaceAll(",",str_rep2);

同时,npinti的建议也很好用。

这仅适用于特定的字符串:abc d 1234567890pqr 54897。 - Paulius Matulionis

2

使用Java Scanner类的示例

import java.util.Scanner;

Scanner s = new Scanner( "abc d 1234567890pqr 54897" );
s.useDelimiter( "\\D+" );
while ( s.hasNextInt() ){
    s.nextInt(); // get int
}

1

只提取数字

String str=" abc d 1234567890pqr 54897";        

for(int i=0; i<str.length(); i++)
    if( str.charAt(i) > 47 && str.charAt(i) < 58)
        System.out.print(str.charAt(i));

另一个版本
String str=" abc d 1234567890pqr 54897";        
boolean flag = false;
for(int i=0; i<str.length(); i++)
    if( str.charAt(i) > 47 && str.charAt(i) < 58) {
        System.out.print(str.charAt(i));
        flag = true;
    } else {
        System.out.print( flag ? '\n' : "");
        flag = false;
    }

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