Controlla se una stringa contiene numeri Java


102

Sto scrivendo un programma in cui l'utente inserisce una stringa nel seguente formato:

"What is the square of 10?"
  1. Devo controllare che ci sia un numero nella stringa
  2. e quindi estrai solo il numero.
  3. Se uso .contains("\\d+")o .contains("[0-9]+"), il programma non riesce a trovare un numero nella stringa, indipendentemente dall'ingresso, ma .matches("\\d+")funzionerà solo quando ci sono solo numeri.

Cosa posso usare come soluzione per trovare ed estrarre?


Se vuoi estrarre il primo numero, non solo la cifra dalla stringa di input, vedi la mia risposta.
Sajal Dutta

Risposte:


229

prova questo

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

2
cosa fa il doppio backslash?
ankit

15
Per spiegare:. * Significa qualsiasi carattere da 0 a ricorrenza infinita, rispetto a \\ d + (doppia barra rovesciata penso sia solo per sfuggire alla seconda barra rovesciata) e \ d + indica una cifra da 1 volta a infinito.
Giudark

6
Non è magia aliena, è criptico BS, dai tempi in cui nessuno poteva fare queste cose tranne gli ingegneri che l'hanno inventata perché è fondamentalmente un codice segreto che solo i creatori conoscono fino a quando non lo condividono.
JamisonMan111

Modificato, perché se è presente solo una cifra, la soluzione è abbastanza buona, non è necessario avere 1 o più cifre in questo caso.
Yassin Hajaj

26

Se vuoi estrarre il primo numero dalla stringa di input, puoi fare-

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

Esempi:

Per l'input "123abc", il metodo precedente restituirà 123.

Per "abc1000def", 1000.

Per "555abc45", 555.

Per "abc", restituirà una stringa vuota.


11

Penso che sia più veloce di 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;
}

Mi dispiace di non aver visto l'estrazione.Se vuoi estrarre il numero in stringa, puoi facilmente modificare questo codice.
Melih Altıntaş

10

s=s.replaceAll("[*a-zA-Z]", "") sostituisce tutti gli alfabeti

s=s.replaceAll("[*0-9]", "") sostituisce tutti i valori numerici

se esegui due sostituzioni sopra, otterrai tutte le stringhe con caratteri speciali

Se vuoi estrarre solo numeri interi da un file String s=s.replaceAll("[^0-9]", "")

Se vuoi estrarre solo alfabeti da un file String s=s.replaceAll("[^a-zA-Z]", "")

Buona codifica :)


10

Non sono riuscito a trovare un singolo modello corretto. Si prega di seguire la guida di seguito per una soluzione piccola e dolce.

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

Funziona davvero bene. L'unica cosa a cui devi fare attenzione è se la stringa contiene una barra rovesciata. Se lo fa, penso che questo produrrà un errore di "carattere di escape illegale".
w3bshark

questo è il migliore
Yashwin Munsadwala

9

Il codice seguente è sufficiente per "Controlla se una stringa contiene numeri in 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 prima riga ha un errore minore, parentesi mancante in String. Pattern p = Pattern.compile ("(([AZ]. * [0-9]))");
Gaurav Tyagi

inoltre, questo non funziona ... il test funziona, ma 123TEST non funziona.
fergal_dd

7

Prova il seguente schema:

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

Tuttavia, se l'utente è educato e dice che "please"questo fallirà. Inoltre, nell'esempio di OP, c'è un "?" di cui tenere conto.
Christopher

1
Sei sicuro di averlo risolto?
Christopher

Questa espressione non funziona per una risposta come "10"per esempio.
fabdouglas

6

La soluzione che ho scelto è simile a questa:

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

Sono sicuro che non sia una soluzione perfetta, ma si adattava alle mie esigenze. Grazie a tutti per l'aiuto. :)


1

Puoi provare questo

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

Dato che non vuoi solo cercare un numero ma anche estrarlo, dovresti scrivere una piccola funzione che lo faccia per te. Vai lettera per lettera finché non trovi una cifra. Ah, ho appena trovato il codice necessario per te su stackoverflow: trova numero intero nella stringa . Guarda la risposta accettata.


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+.*")funziona solo per i numeri ma non per altri simboli come //o *ecc.


0

ASCII è all'inizio di UNICODE, quindi puoi fare qualcosa del genere:

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

Sono sicuro che puoi capire gli altri valori ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.