Каков наилучший способ извлечь первое слово из строки в Java? - PullRequest
51 голосов
/ 21 февраля 2011

Попытка написать короткий метод, чтобы я мог разобрать строку и извлечь первое слово. Я искал лучший способ сделать это.

Полагаю, я бы использовал str.split(","), однако я хотел бы получить только первое первое слово из строки, сохранить его в одной переменной и поместить остальные токены в другую переменную.

Есть ли краткий способ сделать это?

Ответы [ 12 ]

91 голосов
/ 21 февраля 2011

Второй параметр метода split является необязательным, и, если он указан, будет разбивать целевую строку только N раз.

Например:

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

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

В качестве альтернативы вы можете использовать substring метод String .

42 голосов
/ 21 февраля 2011

Вы должны делать это

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);

Вышеуказанный способ является наиболее быстрым для выполнения этой задачи.

31 голосов
/ 09 июня 2013

Для упрощения вышесказанного:

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

Вот готовая функция:

  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.
    }
  }
9 голосов
/ 02 июля 2015

Простой, который я использовал, это

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

Где str - ваша строка или текст, бла бла :).Так, , если

  1. str имеет пустое значение, оно возвращается как есть.
  2. str имеет одно слово, оно возвращается как есть.
  3. str - это несколько слов, оно извлекает первое слово и возвращает.

Надеюсь, это полезно.

6 голосов
/ 21 февраля 2011

Вы можете использовать String.split с пределом 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.
  • Документы API для: split
4 голосов
/ 11 февраля 2016
import org.apache.commons.lang3.StringUtils;

...
StringUtils.substringBefore("Grigory Kislin", " ")
2 голосов
/ 21 февраля 2011

Вы также можете использовать http://download.oracle.com/javase/6/docs/api/java/util/StringTokenizer.html

2 голосов
/ 21 февраля 2011

Вы можете использовать сканер

http://download.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

Сканер также может использовать разделители, отличные от пробелов.Этот пример читает несколько элементов из строки:

     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(); 

выводит следующий вывод:

     1
     2
     red
     blue
0 голосов
/ 26 декабря 2018

Ни один из этих ответов, по-видимому, не определяет, что ОП может означать «слово».Как уже говорили другие, «граница слова» может быть запятой и, конечно, не может быть пробелом или даже «пробелом» (т. Е. Также символами табуляции, перевода строки и т. Д.)

В самом простом я бы сказал, что слово должно состоять из любых букв Unicode и любых цифр.Даже это может быть неправильно: String может не квалифицироваться как слово, если оно содержит цифры или начинается с цифры.Кроме того, как быть с дефисами или апострофами, которых, по-видимому, существует несколько вариантов во всем Unicode?Разные дискуссии такого рода и многие другие будут применяться не только к английскому языку, но и ко всем остальным языкам, включая не человеческий язык, научную запись и т. Д. Это большая тема.

Но для начала может быть так(Примечание написано на 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]}|"

Это нормально для первого, второго и третьего givenString с.Для «&& ^^^%» говорится, что первое «слово» - это строка нулевой длины, а второе - «^^^».На самом деле, ведущий токен нулевой длины - это способ String.split сказать «ваша строка начинается не с токена, а с разделителем».

NB в регулярном выражении \p{L} означает «любая буква Юникода».Параметр String.split - это, конечно, то, что определяет «шаблон разделителя» ... то есть группу символов, которая разделяет токены.

NB2 Проблемы с производительностью не имеют значения для такого обсуждения и почти наверняка для всех контекстов.

NB3 Моим первым портом захода был пакет StringUtils от Apache Commons.Вероятно, у них будут самые эффективные и лучшие инженерные решения для такого рода вещей.Но ничего не выпрыгнуло ... https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html ... хотя там может скрываться что-то полезное.

0 голосов
/ 06 февраля 2018

Я знаю, что на этот вопрос уже был дан ответ, но у меня есть другое решение (для тех, кто все еще ищет ответы), которое может уместиться в одну строку: оно использует функцию разделения, но дает вам только 1-ю сущность.

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

Вывод покажет:

123
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...