J'ai une variable String (essentiellement une phrase en anglais avec un nombre non spécifié de nombres) et j'aimerais extraire tous les nombres dans un tableau d'entiers. Je me demandais s'il y avait une solution rapide avec les expressions régulières?
J'ai utilisé la solution de Sean et l'ai légèrement modifiée:
LinkedList<String> numbers = new LinkedList<String>();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(line);
while (m.find()) {
numbers.add(m.group());
}
Réponses:
... imprime
-2
et12
.-? correspond à un signe négatif de premier plan - éventuellement. \ d correspond à un chiffre, et nous devons cependant écrire
\
comme\\
dans une chaîne Java. Ainsi, \ d + correspond à 1 ou plusieurs chiffres.la source
2,000
. Pour une telle utilisation-?\\d+,?\\d+|-?\\d+
-?\\d+(,\\d{3})*
devrait fonctionner.Qu'en est-il de l'utilisation de la
replaceAll
méthode java.lang.String:Production:
La description
[
et]
délimite un ensemble de caractères à mettre en correspondance, c'est-à-dire une seule fois dans n'importe quel ordre^
Identifiant spécial utilisé au début de l'ensemble, utilisé pour indiquer de faire correspondre tous les caractères non présents dans l'ensemble délimité, au lieu de tous les caractères présents dans l'ensemble.+
Entre un et des temps illimités, autant de fois que possible, en redonnant au besoin-?
Un des caractères «-» et «?»0-9
Un caractère compris entre «0» et «9»la source
-
par lui - même comme un nombre, ainsi que des choses comme9-
,---6
et1-2-3
.Vous pouvez en fait remplacer [0-9] par \ d, mais cela implique un échappement de double barre oblique inverse, ce qui rend la lecture plus difficile.
la source
Ceci est pour extraire des nombres en conservant la décimale
la source
La réponse acceptée détecte les chiffres mais ne détecte pas les nombres formatés, par exemple 2 000, ni les décimales, par exemple 4,8. Pour une telle utilisation
-?\\d+(,\\d+)*?\\.?\\d+?
:Production:
[4.8, 2,000]
la source
(?:\.\d+)?
)pour les nombres rationnels, utilisez celui-ci:
(([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))
la source
En utilisant Java 8, vous pouvez faire:
Si vous n'avez pas de nombres négatifs, vous pouvez vous débarrasser de
replaceAll
(et utiliser!s.isEmpty()
dansfilter
), car c'est seulement pour diviser correctement quelque chose comme2-34
(cela peut également être géré uniquement avec regex insplit
, mais c'est assez compliqué).Arrays.stream
transforme notreString[]
en unStream<String>
.filter
se débarrasse des chaînes vides de début et de fin ainsi que de tout-
qui ne font pas partie d'un nombre.mapToInt(Integer::parseInt).toArray()
appelleparseInt
chacunString
à nous donner unint[]
.Alternativement, Java 9 a une méthode Matcher.results , qui devrait permettre quelque chose comme:
Dans l'état actuel des choses, ni l'un ni l'autre ne représente une grande amélioration par rapport à la simple lecture en boucle des résultats avec
Pattern
/Matcher
comme indiqué dans les autres réponses, mais cela devrait être plus simple si vous souhaitez suivre cela avec des opérations plus complexes qui sont considérablement simplifiées avec l'utilisation de ruisseaux.la source
Extrayez tous les nombres réels en utilisant ceci.
la source
Les fractions et les caractères de regroupement pour représenter les nombres réels peuvent différer selon les langues. Le même nombre réel peut être écrit de manière très différente selon la langue.
Le nombre deux millions en allemand
2 000 000,00
et en anglais
2.000.000,00
Une méthode pour extraire complètement les nombres réels d'une chaîne donnée d'une manière indépendante du langage:
la source
Si vous souhaitez exclure des nombres contenus dans des mots, tels que bar1 ou aa1bb, ajoutez des limites de mot \ b à l'une des réponses basées sur les regex. Par exemple:
affiche:
la source
Je suggérerais de vérifier les valeurs ASCII pour extraire les nombres d'une chaîne Supposons que vous ayez une chaîne d'entrée en tant que myname12345 et si vous souhaitez simplement extraire les nombres 12345, vous pouvez le faire en convertissant d'abord la chaîne en tableau de caractères, puis utilisez le pseudocode suivant
une fois les nombres extraits, ajoutez-les à un tableau
J'espère que cela t'aides
la source
J'ai trouvé cette expression la plus simple
la source
extrait uniquement les nombres de la chaîne
la source