113 votes

Comment extraire des nombres d'une chaîne et obtenir un tableau d'ints ?

J'ai une variable de type String (en gros une phrase anglaise avec un nombre indéterminé de chiffres) et j'aimerais extraire tous les chiffres dans un tableau d'entiers. Je me demandais s'il existait une solution rapide avec des expressions régulières ?


J'ai utilisé la solution de Sean en la modifiant légèrement :

LinkedList<String> numbers = new LinkedList<String>();

Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(line); 
while (m.find()) {
   numbers.add(m.group());
}

1 votes

Les chiffres sont-ils entourés d'espaces ou d'autres caractères ? Comment les nombres sont-ils formatés, sont-ils hexadécimaux, octaux, binaires, décimaux ?

0 votes

Je pensais que c'était clair dans la question : c'est une phrase anglaise avec des chiffres. De plus, je parlais d'un tableau d'entiers, donc ce que je cherchais était des entiers.

182voto

Sean Owen Points 36577
Pattern p = Pattern.compile("-?\\d+");
Matcher m = p.matcher("There are more than -2 and less than 12 numbers here");
while (m.find()) {
  System.out.println(m.group());
}

... tirages -2 y 12 .


- ? correspond à un signe négatif en tête -- facultatif. \d correspond à un chiffre, et nous devons écrire \ comme \\ dans une chaîne de caractères Java. Donc, \d + correspond à 1 ou plusieurs chiffres.

4 votes

Pourriez-vous compléter votre réponse en expliquant votre expression régulière s'il vous plaît ?

3 votes

- ? correspond à un signe négatif en tête -- facultatif. \d correspond à un chiffre, et nous devons écrire \ en tant que \\ dans une chaîne Java. Donc, \\d + correspond à 1 chiffre de plus

8 votes

J'ai changé mon expression en Pattern.compile("- ?[? \\d\\. ]+") pour supporter les flotteurs. Vous m'avez définitivement mis sur la voie, merci !

55voto

Maxim Shoustin Points 20035

Et si on utilisait replaceAll Méthode java.lang.String :

    String str = "qwerty-1qwerty-2 455 f0gfg 4";      
    str = str.replaceAll("[^-?0-9]+", " "); 
    System.out.println(Arrays.asList(str.trim().split(" ")));

Sortie :

[-1, -2, 455, 0, 4]

Description

[^-?0-9]+
  • [ y ] délimite un ensemble de caractères qui doivent faire l'objet d'une correspondance unique, c'est-à-dire une seule fois dans un ordre quelconque.
  • ^ Identifiant spécial utilisé au début du jeu, utilisé pour indiquer qu'il faut faire correspondre tous les caractères. no présents dans l'ensemble délimité, au lieu de tous les caractères présents dans l'ensemble.
  • + Entre une et un nombre illimité de fois, autant de fois que possible, en redonnant selon les besoins.
  • -? Un des caractères "-" et " ?".
  • 0-9 Un caractère compris entre "0" et "9".

6 votes

Pourquoi voulez-vous garder des points d'interrogation ? Aussi, cela traite - par lui-même comme un nombre, ainsi que des choses comme 9- , ---6 y 1-2-3 .

1 votes

Une très bonne alternative sans utiliser de bibliothèques d'importation ;)

19voto

sidereal Points 749
Pattern p = Pattern.compile("[0-9]+");
Matcher m = p.matcher(myString);
while (m.find()) {
    int n = Integer.parseInt(m.group());
    // append n to list
}
// convert list to array, etc

Vous pouvez en fait remplacer [0-9] par \d mais cela implique un double échappement de barres obliques inversées, ce qui rend la lecture plus difficile.

0 votes

Oups. Sean gère les nombres négatifs, donc c'est une amélioration.

2 votes

Le vôtre gère aussi les nombres négatifs si vous utilisez "- ?[0-9]+".

9voto

Kannan Points 51
  StringBuffer sBuffer = new StringBuffer();
  Pattern p = Pattern.compile("[0-9]+.[0-9]*|[0-9]*.[0-9]+|[0-9]+");
  Matcher m = p.matcher(str);
  while (m.find()) {
    sBuffer.append(m.group());
  }
  return sBuffer.toString();

C'est pour extraire les nombres retenant la décimale

0 votes

Ne gère pas les points négatifs

4voto

Andrey Points 36869

Pour les nombres rationnels, utilisez celui-ci : (([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))

1 votes

Le PO a dit nombres entiers, pas nombres réels. De plus, vous avez oublié d'échapper les points, et aucune de ces parenthèses n'est nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X