Compruebe si una cadena contiene números Java

102

Estoy escribiendo un programa donde el usuario ingresa una Cadena en el siguiente formato:

"What is the square of 10?"
  1. Necesito verificar que haya un número en la Cadena
  2. y luego extraiga solo el número.
  3. Si uso .contains("\\d+")o .contains("[0-9]+"), el programa no puede encontrar un número en la cadena, sin importar cuál sea la entrada, pero .matches("\\d+")solo funcionará cuando solo haya números.

¿Qué puedo usar como solución para buscar y extraer?

Duane
fuente
Si desea extraer el primer número, no solo el dígito de la cadena de entrada, vea mi respuesta.
Sajal Dutta

Respuestas:

229

prueba esto

str.matches(".*\\d.*");
Evgeniy Dorofeev
fuente
2
¿Qué hace la doble barra invertida?
ankit
15
Para explicar:. * Significa cualquier carácter de 0 a ocurrencia infinita, que \\ d + (doble barra invertida creo que es solo para escapar de la segunda barra invertida) y \ d + significa un dígito de 1 vez a infinito.
Giudark
6
No es magia alienígena, es una tontería críptica, de los días en que nadie podía hacer estas cosas excepto los ingenieros que lo inventaron porque es básicamente un código secreto que solo los creadores conocen hasta que lo comparten.
JamisonMan111
Modificado, porque si solo hay un dígito, la solución es lo suficientemente buena, no es necesario tener 1 o más dígitos en este caso.
Yassin Hajaj
26

Si desea extraer el primer número de la cadena de entrada, puede hacerlo:

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

Ejemplos:

Para la entrada "123abc", el método anterior devolverá 123.

Para "abc1000def", 1000.

Para "555abc45", 555.

Para "abc", devolverá una cadena vacía.

Sajal Dutta
fuente
11

Creo que es más rápido 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;
}
Melih Altıntaş
fuente
Lamento no haber visto la extracción. Si desea extraer el número en una cadena, puede editar fácilmente este código.
Melih Altıntaş
10

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

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

si lo hace por encima de dos reemplazos, obtendrá todas las cadenas con caracteres especiales

Si desea extraer solo enteros de un String s=s.replaceAll("[^0-9]", "")

Si desea extraer solo alfabetos de un String s=s.replaceAll("[^a-zA-Z]", "")

Feliz codificación :)

Mallikarjuna Sangisetty
fuente
10

No pude encontrar un solo patrón correcto. Siga la guía a continuación para obtener una solución pequeña y dulce.

String regex = "(.)*(\\d)(.)*";      
Pattern pattern = Pattern.compile(regex);
String msg = "What is the square of 10?";
boolean containsNumber = pattern.matcher(msg).matches();
Ishaan
fuente
Esto funciona muy bien. Lo único que debe tener en cuenta es si la cadena contiene una barra invertida. Si es así, creo que producirá un error de "carácter de escape ilegal".
w3bshark
esto es lo mejor
Yashwin Munsadwala
9

El siguiente código es suficiente para "Comprobar si una cadena contiene números en Java"

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

if(m.find()){
    System.out.println("Hello "+m.find());
}
Narendra
fuente
8
Pattern p = Pattern.compile("(([A-Z].*[0-9])");
Matcher m = p.matcher("TEST 123");
boolean b = m.find();
System.out.println(b);
Reddy
fuente
3
La primera línea tiene un error menor, falta el corchete en String. Patrón p = Patrón.compile ("(([AZ]. * [0-9]))");
Gaurav Tyagi
Además, esto no funciona ... la prueba funciona, pero 123TEST no funcionará.
fergal_dd
7

Prueba el siguiente patrón:

.matches("[a-zA-Z ]*\\d+.*")
Konstantin Yovkov
fuente
Sin embargo, si el usuario es cortés y dice que "please"esto fallará. Además, en el ejemplo de OP, hay un "?" para dar cuenta.
christopher
1
¿Estás seguro de que lo has arreglado?
christopher
Esta expresión no funciona para una respuesta como "10"muestra.
fabdouglas
6

La solución con la que fui se ve así:

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

Estoy seguro de que no es una solución perfecta, pero se adapta a mis necesidades. Gracias a todos por la ayuda. :)

Duane
fuente
1

Puedes probar esto

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");
    }     
Ruchira Gayan Ranaweera
fuente
1

Como no solo desea buscar un número, sino también extraerlo, debe escribir una pequeña función que lo haga por usted. Vaya letra por letra hasta que encuentre un dígito. Ah, acabo de encontrar el código necesario para ti en stackoverflow: encuentra entero en cadena . Mira la respuesta aceptada.

Thorsten Kettner
fuente
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";
    }
eyad david
fuente
1

.matches(".*\\d+.*")sólo funciona para los números, pero no otros símbolos como el //o *etc.

Rickyras
fuente
0

ASCII está al comienzo de UNICODE, por lo que puede hacer algo como esto:

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

Estoy seguro de que puedes averiguar los otros valores ...

Brad Yuan
fuente