Vérifier si une chaîne contient des nombres Java

102

J'écris un programme dans lequel l'utilisateur entre une chaîne au format suivant:

"What is the square of 10?"
  1. Je dois vérifier qu'il y a un nombre dans la chaîne
  2. puis extraire uniquement le nombre.
  3. Si j'utilise .contains("\\d+")ou .contains("[0-9]+"), le programme ne trouve pas de nombre dans la chaîne, quelle que soit l'entrée, mais .matches("\\d+")ne fonctionnera que lorsqu'il n'y a que des nombres.

Que puis-je utiliser comme solution pour rechercher et extraire?

Duane
la source
Si vous souhaitez extraire le premier nombre, pas seulement le chiffre de la chaîne d'entrée, consultez ma réponse.
Sajal Dutta

Réponses:

230

essaye ça

str.matches(".*\\d.*");
Evgeniy Dorofeev
la source
2
que fait la double barre oblique inverse?
ankit
15
Pour expliquer:. * Signifie n'importe quel caractère de 0 à une occurrence infinie, que le \\ d + (double barre oblique inverse, je pense, est juste pour échapper à la deuxième barre oblique inverse) et \ d + signifie un chiffre de 1 fois à l'infini.
Giudark
6
Ce n'est pas de la magie extraterrestre, c'est une BS cryptique, à l'époque où personne ne pouvait faire ce genre de choses, mais les ingénieurs qui l'ont inventé parce que c'est fondamentalement un code secret que seuls les créateurs connaissent jusqu'à ce qu'ils le partagent.
JamisonMan111
Modifié, car si un seul chiffre est présent, la solution est assez bonne, pas besoin d'avoir 1 ou plusieurs chiffres dans ce cas.
Yassin Hajaj
26

Si vous souhaitez extraire le premier nombre de la chaîne d'entrée, vous pouvez faire-

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

Exemples:

Pour l'entrée "123abc", la méthode ci-dessus renverra 123.

Pour «abc1000def», 1000.

Pour «555abc45», 555.

Pour "abc", retournera une chaîne vide.

Sajal Dutta
la source
11

Je pense que c'est plus rapide 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ş
la source
Je suis désolé de ne pas avoir vu l'extraction.Si vous souhaitez extraire le nombre en chaîne, vous pouvez facilement modifier ce code.
Melih Altıntaş
10

s=s.replaceAll("[*a-zA-Z]", "") remplace tous les alphabets

s=s.replaceAll("[*0-9]", "") remplace tous les chiffres

si vous faites au-dessus de deux remplacements, vous obtiendrez toute la chaîne de caractères spéciaux

Si vous souhaitez extraire uniquement des entiers d'un String s=s.replaceAll("[^0-9]", "")

Si vous souhaitez extraire uniquement les alphabets d'un String s=s.replaceAll("[^a-zA-Z]", "")

Bon codage :)

Mallikarjuna Sangisetty
la source
10

Je n'ai pas trouvé un seul motif correct. Veuillez suivre le guide ci-dessous pour une solution petite et douce.

String regex = "(.)*(\\d)(.)*";      
Pattern pattern = Pattern.compile(regex);
String msg = "What is the square of 10?";
boolean containsNumber = pattern.matcher(msg).matches();
Ishaan
la source
Cela fonctionne vraiment bien. La seule chose dont vous devez faire attention est si la chaîne contient une barre oblique inverse. Si c'est le cas, alors je pense que cela produira une erreur "caractère d'échappement illégal".
w3bshark
c'est le meilleur
Yashwin Munsadwala
9

Le code ci-dessous suffit pour "Vérifier si une chaîne contient des nombres 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
la source
8
Pattern p = Pattern.compile("(([A-Z].*[0-9])");
Matcher m = p.matcher("TEST 123");
boolean b = m.find();
System.out.println(b);
Reddy
la source
3
La première ligne a une erreur mineure, le crochet est manquant dans la chaîne. Pattern p = Pattern.compile ("(([AZ]. * [0-9]))");
Gaurav Tyagi
aussi, cela ne fonctionne pas ... le test fonctionne, mais 123TEST ne fonctionnera pas.
fergal_dd
7

Essayez le modèle suivant:

.matches("[a-zA-Z ]*\\d+.*")
Konstantin Yovkov
la source
Cependant, si l'utilisateur est poli et dit que "please"cela échouera. De plus, dans l'exemple d'OP, il y a un "?" pour tenir compte de.
christopher
1
Êtes-vous sûr de l'avoir résolu?
christopher
Cette expression ne fonctionne pas pour une réponse comme "10"pour sample.
fabdouglas
6

La solution que j'ai choisie ressemble à ceci:

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

Je suis sûr que ce n'est pas une solution parfaite, mais elle répondait à mes besoins. Merci à tous pour votre aide. :)

Duane
la source
1

Vous pouvez essayer ceci

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
la source
1

Comme vous ne voulez pas seulement rechercher un nombre, mais aussi l'extraire, vous devriez écrire une petite fonction le faisant pour vous. Allez lettre par lettre jusqu'à ce que vous repériez un chiffre. Ah, je viens de trouver le code nécessaire pour vous sur stackoverflow: trouver un entier dans la chaîne . Regardez la réponse acceptée.

Thorsten Kettner
la source
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
la source
1

.matches(".*\\d+.*")ne fonctionne que pour les nombres mais pas pour les autres symboles comme //ou *etc.

Rickyras
la source
0

ASCII est au début d'UNICODE, vous pouvez donc faire quelque chose comme ceci:

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

Je suis sûr que vous pouvez comprendre les autres valeurs ...

Brad Yuan
la source