从Java中的字符串中提取第一个单词的最佳方法是什么?

时间:2011-02-21 15:42:49

标签: java string

尝试编写一个简短的方法,以便我可以解析字符串并提取第一个单词。我一直在寻找最佳方法。

我假设我会使用str.split(","),但是我想从字符串中抓取第一个第一个单词,并将其保存在一个变量中,并将其余的标记放在另一个变量中。

这样做有简洁的方法吗?

14 个答案:

答案 0 :(得分:90)

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

或者,您可以使用Stringsubstring方法。

答案 1 :(得分:42)

你应该这样做

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

以上是执行此任务的最快方法。

答案 2 :(得分:31)

简化上述内容:

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.
    }
  }

答案 3 :(得分:9)

我以前做的简单就是

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

str是你的字符串或文字bla bla :)。所以,如果

  1. str具有空值,并按原样返回。
  2. str有一个单词,它会按原样返回。
  3. str是多个单词,它会提取第一个单词并返回。
  4. 希望这有用。

答案 4 :(得分:6)

您可以使用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.

答案 5 :(得分:3)

import org.apache.commons.lang3.StringUtils;

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

答案 6 :(得分:2)

您可以使用扫描仪

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

答案 7 :(得分:2)

答案 8 :(得分:0)

像这样:

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

arr[0]是第一个单词,arr[1]是其余单词

答案 9 :(得分:0)

我知道这个问题已经得到了解答,但是我有另一个解决方案(对于那些仍在寻找答案的人)可以放在一行: 它使用拆分功能,但只为您提供第一个实体。

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

输出将显示:

123

答案 10 :(得分:0)

这些答案似乎都没有定义OP可能用“单词”表示的含义。正如其他人已经说过的那样,“单词边界”可能是逗号,并且肯定不能指望是空格,甚至是“空白”(也就是制表符,换行符等)

最简单的说,这个单词必须由任何Unicode字母和任何数字组成。甚至这可能是不正确的:String如果包含数字或以数字开头,则可能不符合单词的条件。此外,连字符或撇号在整个Unicode中大概有几个变体呢?这种讨论以及许多其他讨论将不仅适用于英语,而且还适用于所有其他语言,包括非人类语言,科学符号等。这是一个很大的话题。

但是可能是这样(NB用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的一种说法:“给定的String并非以令牌开头,而是定界符”。

正则表达式\p{L}中的

NB表示“任何Unicode字母”。 String.split的参数当然是定义“定界符模式”的参数...,即,用于分隔标记的一簇字符。

NB2性能问题与此类讨论无关紧要,而且几乎可以肯定在所有情况下都是如此。

NB3我最先拜访的是Apache Commons的StringUtils软件包。他们可能会为此类事情提供最有效和最佳工程解决方案。但是什么也没有跳出来……https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html ...尽管可能有一些有用的东西潜伏在那里。

答案 11 :(得分:0)

针对那些正在寻找kotlin的人

var delimiter = " "  
var mFullname = "Mahendra Rajdhami"  
var greetingName = mFullname.substringBefore(delimiter)

答案 12 :(得分:0)

我找到的最简单的方法是:

void main() 
  String input = "hello world, this is a line of text";
  
  print(input.split(" ").first);
}

输出:你好

答案 13 :(得分:-2)

String anotherPalindrome = "Niagara. O roar again!"; 
String roar = anotherPalindrome.substring(11, 15); 

你也可以这样做