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?


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

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.


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

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


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

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

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

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


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

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.


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+.*")ne fonctionne que pour les nombres mais pas pour les autres symboles comme //ou *etc.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.