143 votes

À l'aide des Expressions Régulières pour Extraire une Valeur en Java

J'ai plusieurs cordes à la rudesse de la forme:

[some text] [some number] [some more text]

Je veux extraire le texte de [nombre] à l'aide de Java Regex classes.

Je sais à peu près ce que l'expression régulière que je veux utiliser (bien que toutes les suggestions sont les bienvenues). Ce qui m'intéresse vraiment, ce sont les Java appels à prendre la regex chaîne et l'utiliser sur la source de données pour produire de la valeur de [nombre].

EDIT: je dois ajouter que je suis seulement intéressé dans un seul [nombre] (en gros, la première instance). Les chaînes sont courtes et je ne vais pas être à la recherche pour de multiples occurrences de [nombre].

274voto

Allain Lalonde Points 28717

De mémoire, la suivante devrait fonctionner:

Pattern p = Pattern.compile("^[a-zA-Z]+([0-9]+).*");
Matcher m = p.matcher("Testing123Testing");

if (m.find()) {
    System.out.println(m.group(1));
}

33voto

Axeman Points 24103

Allain a fondamentalement le code java, donc vous pouvez l'utiliser. Cependant, son expression valide seulement si vos numéros sont précédés par un flux de caractères de mot.

"(\\d+)"

devriez être capable de trouver la première chaîne de chiffres. Vous n'avez pas besoin de spécifier ce qui est devant elle, si vous êtes sûr que ça va être la première chaîne de chiffres. De même, il est inutile de spécifier ce qui est après, à moins que vous le voulez. Si vous voulez juste le nombre, et que vous êtes sûr que ce sera la première chaîne d'un ou de plusieurs chiffres puis c'est tout ce dont vous avez besoin.

Si vous vous attendez à être compensée par des espaces, il sera encore plus distinctes pour définir"

"\\s+(\\d+)\\s+"

peut-être mieux.

Si vous avez besoin de toutes les trois parties, cela va faire:

"(\\D+)(\\d+)(.*)"

MODIFIER Les Expressions données par Allain et Jack suggèrent que vous devez spécifier un sous-ensemble de chiffres pour saisir les chiffres. Si vous dites le moteur d'expressions régulières vous êtes à la recherche pour \d alors il va ignorer tout ce qui est avant les chiffres. Si J ou l'expression qui correspond à votre modèle, puis l'ensemble du match est égal à la chaîne d'entrée. Et il n'y a pas de raison de le préciser. C'est probablement ralentit propre match, si ce n'est pas totalement ignorée.

32voto

javaMan Points 723
  public class Regex1
  {
   public static void main(String[]args)
    {
     Pattern p = Pattern.compile("\\d+");
     Matcher m = p.matcher("hello1234goodboy789very2345");
     while(m.find())
      {
        System.out.println(m.group());
      }
    }
  }

Sortie:

1234
789
2345

11voto

Vitalii Fedorenko Points 17469

En plus de Modèle, la Java de la Chaîne de classe a également plusieurs méthodes qui peuvent travailler avec des expressions régulières, dans votre cas, le code sera:

"ab123abc".replaceFirst("\\D*(\\d*).*", "$1")

\\D est un chiffre de caractère.

9voto

Jack Leow Points 11081

Dans Java 1.4 et jusqu':

String input = "...";
Matcher matcher = Pattern.compile("[^0-9]+([0-9]+)[^0-9]+").matcher(input);
if (matcher.find()) {
    String someNumberStr = matcher.group(1);
    // if you need this to be an int:
    int someNumberInt = Integer.parseInt(someNumberStr);
}

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: