Split a String Only on the First Occurrence of Delimiter – 只在分隔符的第一次出现时拆分字符串

最后修改: 2021年 11月 8日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

In this tutorial, we’ll learn how to split a Java String only on the first occurrence of a delimiter using two approaches.

在本教程中,我们将学习如何使用两种方法来拆分一个JavaString,只在分隔符的第一次出现时进行。

2. Problem Statement

2 问题陈述

Let’s say we have a text file having each line as a string made up of two parts – the left part indicating a person’s name and the right part indicating their greeting:

假设我们有一个文本文件,每一行都是由两部分组成的字符串–左边部分表示一个人的名字,右边部分表示他们的问候语。

Roberto "I wish you a bug-free day!"
Daniele "Have a great day!"
Jonas "Good bye!"

Subsequently, we want to get the person’s name from each line.

随后,我们要从每一行中获取人的姓名。

We can see that both the parts are separated by a ” ” (space), just like the other words in the right part. So, our delimiter is going to be the space character.

我们可以看到,这两个部分都由一个””(空格)分隔,就像右边部分的其他单词一样。因此,我们的分隔符将是空格字符。

3. Using the split() Method

3.使用split()方法

The split() instance method from the String class splits the string based on the provided regular expression. Moreover, we can use one of its overloaded variants to get the required first occurrence.

split()实例方法来自String类,根据提供的正则表达式来分割字符串。此外,我们可以使用它的一个重载变体来获得所需的第一次出现。

We can provide a limit as a parameter to the split() method to specify the number of times we want to apply the pattern and thus the maximum number of tokens in the resulting array. For example, if we put the limit as n (n >0), it means that the pattern will be applied at most n-1 times.

我们可以提供一个limit作为split()方法的参数,以指定我们想要应用模式的次数,从而指定结果数组中的最大标记数量。例如,如果我们将limit设为n(n >0),这意味着该模式最多应用n-1次。

Here, we’ll be using space (” “) as a regular expression to split the String on the first occurrence of space.

在这里,我们将使用空格(””)作为正则表达式,在空格的第一次出现时分割String

As a result, we can tokenize each line into two parts using the overloaded split() method:

因此,我们可以使用重载的split()方法将每一行标记为两部分。

public String getFirstWordUsingSplit(String input) {
    String[] tokens = input.split(" ", 2);
    return tokens[0];
}

So, if we pass the first line from our example as an input to this method, it will return “Roberto”.

因此,如果我们把例子中的第一行作为输入传给这个方法,它将返回 “Roberto”。

However, if the input String has only one word or has no space in it, the above method will simply return the same String.

然而,如果输入的String只有一个单词或没有空格,上述方法将简单地返回相同的String

Let’s test this out:

让我们来测试一下。

assertEquals("Roberto", getFirstWordUsingSplit("Roberto \"I wish you a bug-free day\""));
assertEquals("StringWithNoSpace", getFirstWordUsingSplit("StringWithNoSpace"));

4. Using the substring() Method

4.使用 substring()方法

The substring() method of the String class returns the substring of a String. It’s an overloaded method, where one of the overloaded versions accepts the index and returns all the characters in the string until the given index.

substring()类的方法返回String的子串。这是一个重载方法,其中一个重载版本接受index并返回字符串中直到指定索引的所有字符。

Let’s combine substring() and indexOf() to solve the same problem.

让我们结合substring()indexOf()来解决同一个问题

Firstly, we’ll get the index of the first space character. Then, we’ll get the substring until this index which will be our result, the person’s name:

首先,我们将得到第一个空格字符的索引。然后,我们将得到直到这个索引的子串,这将是我们的结果,即这个人的名字。

public String getFirstWordUsingSubString(String input) {
    return input.substring(0, input.indexOf(" "));
}

If we pass the same input String as before, our method will return the String “Roberto”.

如果我们像以前一样传递相同的输入String,我们的方法将返回String“Roberto”。

However, if the input String doesn’t contain any spaces, then this method will throw StringIndexOutOfBoundsException. If a match is not found, the indexOf() method returns -1.

然而,如果输入的String不包含任何空格,那么这个方法将抛出StringIndexOutOfBoundsException如果没有找到一个匹配,indexOf()方法返回-1。

To avoid this exception, we can modify the above method:

为了避免这种异常,我们可以修改上述方法。

public String getFirstWordUsingSubString(String input) {
    int index = input.contains(" ") ? input.indexOf(" ") : 0;
    return input.substring(0, index);
}

Now, if we pass a String with no space to this method, we will get an empty String in return.

现在,如果我们向这个方法传递一个没有空格的String,我们将得到一个空的String返回。

Let’s test this out:

让我们来测试一下。

assertEquals("Roberto", getFirstWordUsingSubString("Roberto \"I wish you a bug-free day\""));
assertEquals("", getFirstWordUsingSubString("StringWithNoSpace"));

5. Conclusion

5.总结

In this article, we have seen two approaches to split a String only on the first occurrence of a delimiter in Java.

在这篇文章中,我们看到了两种在Java中只在分隔符的第一次出现时分割String的方法。

As always, the code is available over on GitHub.

像往常一样,代码可在GitHub上获得