web-dev-qa-db-fra.com

Quel est le meilleur moyen d'extraire le premier mot d'une chaîne en Java?

Essayer d'écrire une méthode courte pour pouvoir analyser une chaîne et extraire le premier mot. Je cherchais le meilleur moyen de le faire.

J'imagine que j'utiliserais str.split(","), mais j'aimerais toutefois ne saisir que le premier mot d'une chaîne et le sauvegarder dans une variable, puis placer le reste des jetons dans une autre.

Y a-t-il un moyen concis de faire cela?

48
user476033

Le deuxième paramètre de la méthode split est facultatif. S'il est spécifié, la chaîne cible ne sera divisée que N fois. 

Par exemple:

String mystring = "the quick brown fox";
String arr[] = mystring.split(" ", 2);

String firstWord = arr[0];   //the
String theRest = arr[1];     //quick brown fox

Vous pouvez également utiliser la méthode substring de String

86
Johan Sjöberg

Tu devrais faire ça

String input = "hello world, this is a line of text";

int i = input.indexOf(' ');
String Word = input.substring(0, i);
String rest = input.substring(i);

Ce qui précède est le moyen le plus rapide de faire cette tâche.

42
adarshr

Pour simplifier ce qui précède: 

text.substring(0, text.indexOf(' ')); 

Voici une fonction prête à l'emploi:

  private String getFirstWord(String text) {
    int index = text.indexOf(' ');
    if (index > -1) { // Check if there is more than one Word.
      return text.substring(0, index); // Extract first Word.
    } else {
      return text; // Text is the first Word itself.
    }
  }
30
Zon

Le simple que je faisais est

str.contains(" ") ? str.split(" ")[0] : str

str est votre chaîne ou votre texte bla bla :). Donc, si

  1. str a une valeur vide et retourne tel quel.
  2. str c'est avoir un mot, il retourne tel quel.
  3. str est plusieurs mots, il extrait le premier mot et retourne.

J'espère que c'est utile.

8
Madan Sapkota

Vous pouvez utiliser String.split avec une limite de 2. 

    String s = "Hello World, I'm the rest.";
    String[] result = s.split(" ", 2);
    String first = result[0];
    String rest = result[1];
    System.out.println("First: " + first);
    System.out.println("Rest: " + rest);

    // prints =>
    // First: Hello
    // Rest: World, I'm the rest.
  • Documents d'API pour: split
6
miku

Vous pouvez utiliser un scanner

http://download.Oracle.com/javase/1.5.0/docs/api/Java/util/Scanner.html

Le scanner peut également utiliser des délimiteurs autre que les espaces. Cet exemple lit plusieurs éléments d'une chaîne:

     String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
     System.out.println(s.nextInt());
     System.out.println(s.nextInt());
     System.out.println(s.next());
     System.out.println(s.next());
     s.close(); 

affiche le résultat suivant:

     1
     2
     red
     blue
2
PDStat
2
Lucas Zamboulis
import org.Apache.commons.lang3.StringUtils;

...
StringUtils.substringBefore("Grigory Kislin", " ")
1
GKislin

Je sais que cette question a déjà reçu une réponse, mais j’ai une autre solution (pour ceux qui recherchent encore des réponses) qui peut tenir sur une seule ligne:.

String test = "123_456";
String value = test.split("_")[0];
System.out.println(value);

La sortie montrera:

123
0
Hughsie28

comme ça:

final String str = "This is a long sentence";
final String[] arr = str.split(" ", 2);
System.out.println(Arrays.toString(arr));

arr[0] est le premier mot, arr[1] est le reste

0
Sean Patrick Floyd

Aucune de ces réponses ne semble définir ce que le PO pourrait vouloir dire par un "mot". Comme d'autres l'ont déjà dit, une "limite de mot" peut être une virgule et ne peut certainement pas être considérée comme un espace, ni même comme un "espace blanc" (c'est-à-dire également des tabulations, des nouvelles lignes, etc.)

Au plus simple, je dirais que le mot doit être composé de lettres Unicode et de chiffres. Même cela peut ne pas être juste: une String peut ne pas être considérée comme un mot si elle contient des nombres ou si elle commence par un nombre. De plus, qu'en est-il des traits d'union, ou des apostrophes, dont il existe probablement plusieurs variantes dans l'ensemble d'Unicode? Toutes sortes de discussions de ce type et de nombreuses autres s’appliqueront non seulement à l’anglais, mais également à toutes les autres langues, y compris la langue non humaine, la notation scientifique, etc. C’est un sujet important.

Mais un début pourrait être ceci (NB écrit en Groovy):

String givenString = "one two9 thr0ee four"
// String givenString = "oňňÜÐæne;:tŵo9===tĥr0eè? four!"
// String givenString = "mouse"
// String givenString = "&&^^^%"

String[] substrings = givenString.split( '[^\\p{L}^\\d]+' )

println "substrings |$substrings|"

println "first Word |${substrings[0]}|"

Cela fonctionne correctement pour les première, deuxième et troisième givenStrings. Pour "&& ^^^%", il est indiqué que le premier "mot" est une chaîne de longueur nulle et le second est "^^^". En fait, un jeton de longueur zéro est la manière dont String.split dit: "votre chaîne donnée ne commence pas par un jeton mais par un délimiteur".

NB dans regex \p{L} signifie "toute lettre Unicode". Le paramètre String.split est bien sûr ce qui définit le "motif de délimitation" ... c’est-à-dire un groupe de caractères qui sépare les jetons. 

NB2 Les problèmes de performance ne sont pas pertinents pour une discussion de ce type, et presque certainement pour tous les contextes.

NB3 Mon premier point de contact était le package StringUtils d'Apache Commons. Ils disposeront probablement des solutions les plus efficaces et les mieux conçues pour ce genre de choses. Mais rien n’a surgi ... https://commons.Apache.org/proper/commons-lang/apidocs/org/Apache/commons/lang3/StringUtils.html ... bien que quelque chose d’utile puisse se cacher Là.

0
mike rodent