2010-01-30 4 views
5

Les utilisateurs peuvent vouloir délimiter les numéros comme ils le souhaitent.Méthode la plus efficace pour extraire tous les numéros (naturels) d'une chaîne

Quelle est la plus efficace (ou une fonction standard simple) pour extraire tous les nombres (naturels) d'une chaîne?

+0

Notez que les "nombres naturels" sont définis de manière ambiguë (voir http://en.wikipedia.org/wiki/Natural_number). De même, y a-t-il une limite maximale à la taille des numéros que vous voulez autoriser ou peuvent-ils être de n'importe quelle taille? –

Répondre

6

Vous pouvez utiliser une expression régulière. J'ai modifié cet exemple de Sun's regex matcher tutorial:

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

public class Test { 

    private static final String REGEX = "\\d+"; 
    private static final String INPUT = "dog dog 1342 dog doggie 2321 dogg"; 

    public static void main(String[] args) { 
     Pattern p = Pattern.compile(REGEX); 
     Matcher m = p.matcher(INPUT); // get a matcher object 
     while(m.find()) { 
      System.out.println("start(): "+m.start()); 
      System.out.println("end(): "+m.end()); 
     } 
    } 
} 

Il trouve les indices de début et de fin de chaque numéro. Les nombres commençant par 0 sont autorisés avec l'expression régulière \d+, mais vous pouvez facilement changer cela si vous le souhaitez.

0

Si vous connaissez le délimiteur, puis:

String X = "12,34,56"; 
String[] y = X.split(","); // d=delimiter 
int[] z = new int[y.length]; 
for (int i = 0; i < y.length; i++) 
{ 
    z[i] = java.lang.Integer.valueOf(y[i]).intValue(); 
} 

Si vous ne le faites pas, vous avez probablement besoin d'effectuer une pré-processus - que vous pourriez faire x.replace("[A-Za-z]", " "); et remplacer tous les caractères avec des espaces et d'utiliser l'espace comme séparateur.

Espérons que cela aide - Je ne pense pas qu'il existe une fonction intégrée.

2

Je ne suis pas sûr de comprendre exactement votre question. Mais si vous voulez tout est de retirer tous les entiers non négatifs alors cela devrait fonctionner assez bien:

String foo = "12,34,56.0567 junk 6745 some - stuff tab tab 789"; 
String[] nums = foo.split("\\D+"); 

// nums = ["12", "34", "56", "0567", "6745", "789"] 

puis analyser les cordes comme ints (le cas échéant).

Questions connexes