121

我正在编写一个程序,其中用户输入以下格式的字符串:

"What is the square of 10?"
  1. 我需要检查字符串中是否有数字
  2. 然后只提取数字。
  3. 如果我使用.contains("\\d+")or .contains("[0-9]+"),无论输入是什么,程序都无法在字符串中找到数字,但.matches("\\d+")只有在只有数字时才会起作用。

我可以使用什么作为查找和提取的解决方案?

4

16 回答 16

271

尝试这个

str.matches(".*\\d.*");
于 2013-09-03T11:19:02.197 回答
31

如果你想从输入字符串中提取第一个数字,你可以这样做 -

public static String extractNumber(final String str) {                
    
    if(str == null || str.isEmpty()) return "";
    
    StringBuilder sb = new StringBuilder();
    boolean found = false;
    for(char c : str.toCharArray()){
        if(Character.isDigit(c)){
            sb.append(c);
            found = true;
        } else if(found){
            // If we already found a digit before and this char is not a digit, stop looping
            break;                
        }
    }
    
    return sb.toString();
}

例子:

对于输入“123abc”,上述方法将返回 123。

对于“abc1000def”,为 1000。

对于“555abc45”,555。

对于“abc”,将返回一个空字符串。

于 2013-09-03T11:38:22.760 回答
14

我认为它比 regex 快。

public final boolean containsDigit(String s) {
    boolean containsDigit = false;

    if (s != null && !s.isEmpty()) {
        for (char c : s.toCharArray()) {
            if (containsDigit = Character.isDigit(c)) {
                break;
            }
        }
    }

    return containsDigit;
}
于 2013-09-03T11:31:51.447 回答
12

s=s.replaceAll("[*a-zA-Z]", "")替换所有字母

s=s.replaceAll("[*0-9]", "") 替换所有数字

如果您执行以上两个替换,您将获得所有特殊字符的字符串

如果您只想从 a 中提取整数String s=s.replaceAll("[^0-9]", "")

如果您只想从String s=s.replaceAll("[^a-zA-Z]", "")

快乐编码:)

于 2014-05-24T11:30:32.383 回答
11

下面的代码足以“检查字符串是否包含 Java 中的数字”

Pattern p = Pattern.compile("([0-9])");
Matcher m = p.matcher("Here is ur string");

if(m.find()){
    System.out.println("Hello "+m.find());
}
于 2014-03-26T12:14:29.867 回答
11

我找不到一个正确的模式。请按照以下指南获取小而甜蜜的解决方案。

String regex = "(.)*(\\d)(.)*";      
Pattern pattern = Pattern.compile(regex);
String msg = "What is the square of 10?";
boolean containsNumber = pattern.matcher(msg).matches();
于 2017-09-25T15:37:32.753 回答
9
Pattern p = Pattern.compile("(([A-Z].*[0-9])");
Matcher m = p.matcher("TEST 123");
boolean b = m.find();
System.out.println(b);
于 2013-09-03T11:20:10.647 回答
9

我采用的解决方案如下所示:

Pattern numberPat = Pattern.compile("\\d+");
Matcher matcher1 = numberPat.matcher(line);

Pattern stringPat = Pattern.compile("What is the square of", Pattern.CASE_INSENSITIVE);
Matcher matcher2 = stringPat.matcher(line);

if (matcher1.find() && matcher2.find())
{
    int number = Integer.parseInt(matcher1.group());                    
    pw.println(number + " squared = " + (number * number));
}

我确信这不是一个完美的解决方案,但它适合我的需要。谢谢大家的帮助。:)

于 2013-09-03T11:56:36.837 回答
8

尝试以下模式:

.matches("[a-zA-Z ]*\\d+.*")
于 2013-09-03T11:17:56.810 回答
3

下面的代码片段将告诉字符串是否包含数字

str.matches(".*\\d.*")
or
str.matches(.*[0-9].*)

例如

String str = "abhinav123";

str.matches(".*\\d.*") or str.matches(.*[0-9].*)  will return true 

str = "abhinav";

str.matches(".*\\d.*") or str.matches(.*[0-9].*)  will return false
于 2020-10-22T11:31:08.070 回答
2
public String hasNums(String str) {
        char[] nums = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        char[] toChar = new char[str.length()];
        for (int i = 0; i < str.length(); i++) {
            toChar[i] = str.charAt(i);
            for (int j = 0; j < nums.length; j++) {
                if (toChar[i] == nums[j]) { return str; }
            }
        }
        return "None";
    }
于 2016-06-14T19:57:48.970 回答
2

当我被重定向到这里寻找一种在Kotlin语言中查找字符串中数字的方法时,我将把我的发现留给其他想要特定于 Kotlin 的解决方案的人。

找出一个字符串是否包含数字:

val hasDigits = sampleString.any { it.isDigit() }

找出一个字符串是否包含数字:

val hasOnlyDigits = sampleString.all { it.isDigit() }

从字符串中提取数字:

val onlyNumberString = sampleString.filter { it.isDigit() }
于 2021-01-08T09:18:43.900 回答
1

你可以试试这个

String text = "ddd123.0114cc";
    String numOnly = text.replaceAll("\\p{Alpha}","");
    try {
        double numVal = Double.valueOf(numOnly);
        System.out.println(text +" contains numbers");
    } catch (NumberFormatException e){
        System.out.println(text+" not contains numbers");
    }     
于 2013-09-03T11:22:43.880 回答
1

由于您不仅要查找数字而且要提取它,因此您应该编写一个小函数来为您执行此操作。一个字母一个字母地去,直到你找到一个数字。啊,刚刚在 stackoverflow 上为您找到了必要的代码:find integer in string。查看接受的答案。

于 2013-09-03T11:29:45.457 回答
1

.matches(".*\\d+.*")仅适用于数字,但不适用于其他符号,如//or*等​​。

于 2017-05-15T17:51:29.633 回答
0

ASCII 位于 UNICODE 的开头,因此您可以执行以下操作:

(x >= 97 && x <= 122) || (x >= 65 && x <= 90) // 97 == 'a' and 65 = 'A'

我相信您可以找出其他值...

于 2017-08-07T14:39:55.170 回答