web-dev-qa-db-fra.com

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

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

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

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

90
Duane

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 cela répondait à mes besoins. Merci à tous pour l'aide. :)

5
Duane

essaye ça

str.matches(".*\\d.*");
201
Evgeniy Dorofeev

Si vous voulez 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 renvoie 123.

Pour "abc1000def", 1000.

Pour "555abc45", 555.

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

26
Sajal Dutta

Je ne pouvais pas trouver 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();
10
Ishaan

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

s=s.replaceAll("[*0-9]", "") remplace toutes les valeurs numériques

si vous faites plus de deux remplacements, vous obtiendrez tous les caractères spéciaux

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

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

Bonne codage :)

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;
}
9
Melih Altıntaş

Le code ci-dessous est suffisant 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
Narendra

Essayez le modèle suivant:

.matches("[a-zA-Z ]*\\d+.*")
7
Konstantin Yovkov
Pattern p = Pattern.compile("(([A-Z].*[0-9])");
Matcher m = p.matcher("TEST 123");
boolean b = m.find();
System.out.println(b);
7
Reddy

Tu peux essayer ça

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

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

1
Rickyras

Comme vous voulez non seulement chercher un nombre mais aussi l'extraire, vous devriez écrire une petite fonction qui le fait pour vous. Allez lettre par lettre jusqu'à ce que vous trouviez 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
Thorsten Kettner

ASCII est au début de 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 ...

0
Brad Yuan