Verifique se uma string contém números Java


102

Estou escrevendo um programa em que o usuário insere uma String no seguinte formato:

"What is the square of 10?"
  1. Preciso verificar se há um número na string
  2. e extraia apenas o número.
  3. Se eu usar .contains("\\d+")ou .contains("[0-9]+"), o programa não conseguirá encontrar um número na String, não importa qual seja a entrada, mas .matches("\\d+")só funcionará quando houver apenas números.

O que posso usar como solução para localizar e extrair?


Se você quiser extrair o primeiro número, não apenas o dígito da string de entrada, veja minha resposta.
Sajal Dutta

Respostas:


229

tente isso

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

2
o que a barra invertida dupla faz?
ankit

15
Para explicar:. * Significa qualquer caractere de 0 a ocorrência infinita, do que \\ d + (barra invertida dupla, acho que é apenas para escapar da segunda barra invertida) e \ d + significa um dígito de 1 vez ao infinito.
Giudark,

6
Não é magia alienígena, é BS enigmática, desde os dias em que ninguém podia fazer essas coisas, exceto os engenheiros que inventaram porque é basicamente um código secreto que apenas os criadores sabem até que eles compartilhem.
JamisonMan111

Modificado, pois se apenas um dígito estiver presente, a solução é boa o suficiente, não sendo necessário ter 1 ou mais dígitos neste caso.
Yassin Hajaj

26

Se você quiser extrair o primeiro número da string de entrada, você pode fazer-

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

Exemplos:

Para a entrada "123abc", o método acima retornará 123.

Para "abc1000def", 1000.

Para "555abc45", 555.

Para "abc", retornará uma string vazia.


11

Eu acho que é mais rápido do que 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;
}

Lamento não ter visto a extração. Se quiser extrair o número na string, você pode editar este código facilmente.
Melih Altıntaş

10

s=s.replaceAll("[*a-zA-Z]", "") substitui todos os alfabetos

s=s.replaceAll("[*0-9]", "") substitui todos os números

se você fizer mais de duas substituições irá obter todas as cadeias de caracteres especiais

Se você deseja extrair apenas inteiros de um String s=s.replaceAll("[^0-9]", "")

Se você deseja extrair apenas alfabetos de um String s=s.replaceAll("[^a-zA-Z]", "")

Boa codificação :)


10

Não consegui encontrar um único padrão correto. Siga o guia abaixo para uma solução pequena e doce.

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

Isso funciona muito bem. A única coisa que você precisa observar é se a string contém uma barra invertida. Em caso afirmativo, acho que isso produzirá um erro de "caractere de escape ilegal".
w3bshark

este é o melhor
Yashwin Munsadwala

9

O código abaixo é suficiente para "Verificar se uma String contém números em 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
A primeira linha contém um pequeno erro, não há colchete na string. Padrão p = Padrão.compile ("(([AZ]. * [0-9]))");
Gaurav Tyagi

além disso, isso não funciona ... o teste funciona, mas o 123TEST não funciona.
fergal_dd

7

Experimente o seguinte padrão:

.matches("[a-zA-Z ]*\\d+.*")

No entanto, se o usuário for educado e disser, "please"isso irá falhar. Além disso, no exemplo do OP, há um "?" para explicar.
christopher

1
Tem certeza de que corrigiu?
christopher

Esta expressão não funciona para uma resposta como "10"por exemplo.
fabdouglas

6

A solução que usei é a seguinte:

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

Tenho certeza de que não é uma solução perfeita, mas atendeu às minhas necessidades. Obrigado a todos pela ajuda. :)


1

Você pode tentar isso

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

Como você não quer apenas procurar um número, mas também extraí-lo, você deve escrever uma pequena função fazendo isso para você. Vá letra por letra até encontrar um dígito. Ah, acabei de encontrar o código necessário para você no stackoverflow: find integer in string . Veja a resposta aceita.


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+.*")funciona apenas para números, mas não para outros símbolos como //ou *etc.


0

ASCII está no início do UNICODE, então você pode fazer algo assim:

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

Tenho certeza que você pode descobrir os outros valores ...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.