检查字符串是否包含数字Java


102

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

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

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


如果要提取第一个数字,而不仅仅是提取输入字符串中的数字,请参阅我的答案。
萨哈尔·杜塔

Answers:


229

试试这个

str.matches(".*\\d.*");

2
双反斜杠起什么作用?
ankit

15
解释:。*表示从0到无限出现的任何字符,而不是\\ d +(我认为双反斜杠只是为了逃避第二个反斜杠),而\ d +表示从1到无限的数字。
Giudark

6
它不是神秘的BS,它可以追溯到没人能做到的那个年代,而是发明它的工程师,因为它基本上是一个秘密代码,只有创建者才能知道,直到他们共享。
JamisonMan111 '18

已修改,因为如果仅存在一位数字,则解决方案就足够好了,在这种情况下,无需再有一位或更多位数字。
亚辛·哈亚杰

26

如果要从输入字符串中提取第一个数字,则可以执行以下操作-

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”,将返回一个空字符串。


11

我认为它比正则表达式快。

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;
}

很抱歉,我没有看到提取。如果要提取字符串中的数字,则可以轻松地编辑此代码。
MelihAltıntaş13年

10

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

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

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

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

如果您只想从一个字母中提取字母 String s=s.replaceAll("[^a-zA-Z]", "")

快乐的编码:)


10

我找不到正确的单个模式。请按照以下指南进行操作,以获取较小而精巧的解决方案。

String regex = "(.)*(\\d)(.)*";      
Pattern pattern = Pattern.compile(regex);
String msg = "What is the square of 10?";
boolean containsNumber = pattern.matcher(msg).matches();

这真的很好。您唯一需要注意的是字符串是否包含反斜杠。如果确实如此,那么我认为这将产生“非法转义符”错误。
w3bshark

这是最好的
Yashwin Munsadwala

9

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

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

if(m.find()){
    System.out.println("Hello "+m.find());
}

8
Pattern p = Pattern.compile("(([A-Z].*[0-9])");
Matcher m = p.matcher("TEST 123");
boolean b = m.find();
System.out.println(b);

3
第一行有小错误,字符串中缺少括号。模式p = Pattern.compile(“((([AZ]。* [0-9]]))”);
Gaurav Tyagi'3

同样,这不起作用...测试有效,但是123TEST不起作用。
fergal_dd


6

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

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));
}

我确信这不是一个完美的解决方案,但它满足了我的需求。谢谢大家的帮助。:)


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");
    }     

1

因为您不仅要查找数字,而且要提取数字,所以您应该编写一个小函数为您这样做。一个字母一个字母地走,直到发现一个数字。啊,刚刚在stackoverflow上找到了必要的代码:在string中找到整数。查看接受的答案。


1
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";
    }

1

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


0

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

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

我确定您可以找出其他值...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.