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?


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.*");

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.


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

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 :)


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

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

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

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+.*")

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. :)


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

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.


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+.*")sólo funciona para los números, pero no otros símbolos como el //o *etc.


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 ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.