1. 引言

我们都知道,分割字符串是一个非常常见的任务。然而,通常我们只使用一个分隔符进行分割。在本教程中,我们将详细讨论通过多个分隔符分割字符串的不同方法

2. 在Java中使用多个分隔符分割字符串

为了展示下面每个解决方案的分割效果,我们将使用相同的示例字符串:

String example = "Mary;Thomas:Jane-Kate";
String[] expectedArray = new String[]{"Mary", "Thomas", "Jane", "Kate"};

2.1. 正则表达式解决方案

编程人员经常使用不同的正则表达式来定义字符串的搜索模式。在处理字符串分割时,它们也是非常流行的解决方案。现在,让我们看看如何在Java中使用正则表达式根据多个分隔符分割字符串。

首先,我们不需要添加新的依赖,因为正则表达式已经包含在java.util.regex包中。我们只需要定义要分割的输入字符串和模式。

下一步是应用模式。一个模式可以匹配零次或多次。为了根据不同的分隔符分割,我们应该将所有字符都包含在模式中。

我们将编写一个简单的测试来演示这种方法:

String[] names = example.split("[;:-]");
Assertions.assertEquals(4, names.length);
Assertions.assertArrayEquals(expectedArray, names);

我们定义了一个测试字符串,其中的名字应该按照模式中的字符进行分割。模式本身包含了分号、冒号和破折号。当应用于示例字符串时,我们将得到数组中的四个名字。

2.2. Guava解决方案

Guava也提供了根据多个分隔符分割字符串的解决方案。它的解决方案基于一个Splitter类。这个类使用分隔符序列从输入字符串中提取子串。我们可以用多种方式定义这个序列:

  • 单个字符
  • 固定字符串
  • 正则表达式
  • CharMatcher实例

此外,Splitter类提供了两种定义分隔符的方法。接下来,我们将测试这两个方法。

首先,我们需要添加Guava依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>32.1.3-jre</version>
</dependency>

然后,我们从on方法开始:public static Splitter on(Pattern separatorPattern)

它接受用于定义分割分隔符的模式。首先,我们需要定义分隔符的组合并编译模式。之后,我们就可以分割字符串了。

在我们的例子中,我们将使用正则表达式来指定分隔符:

Iterable<String> names = Splitter.on(Pattern.compile("[;:-]")).split(example);
Assertions.assertEquals(4, Iterators.size(names.iterator()));
Assertions.assertIterableEquals(Arrays.asList(expectedArray), names);

另一种方法是onPattern方法:public static Splitter onPattern(String separatorPattern)

与前一个方法的区别在于,onPattern方法接受模式作为字符串,而无需像on方法那样编译。我们将定义相同的分隔符组合来测试onPattern方法:

Iterable<String> names = Splitter.onPattern("[;:-]").split(example);
Assertions.assertEquals(4, Iterators.size(names.iterator()));
Assertions.assertIterableEquals(Arrays.asList(expectedArray), names);

在这两个测试中,我们都成功地分割了字符串,并得到了包含四个名字的数组。

由于我们在使用多个分隔符分割输入字符串,我们还可以在CharMatcher类的on方法中使用anyOf方法:

Iterable<String> names = Splitter.on(CharMatcher.anyOf(";:-")).split(example);
Assertions.assertEquals(4, Iterators.size(names.iterator()));
Assertions.assertIterableEquals(Arrays.asList(expectedArray), names);

这个选项仅适用于Splitter类的on方法。结果与前两个测试相同。

2.3. Apache Commons解决方案

我们将讨论的最后一个选项来自Apache Commons Lang 3库。

首先,在pom.xml文件中添加Apache Commons Lang依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.13.0</version>
</dependency>

接下来,我们将使用StringUtils类的split方法:

String[] names = StringUtils.split(example, ";:-");
Assertions.assertEquals(4, names.length);
Assertions.assertArrayEquals(expectedArray, names);

我们只需要定义用于分割字符串的所有字符。调用split方法将把example字符串分割成四个名字。

3. 总结

在这篇文章中,我们探讨了通过多个分隔符分割输入字符串的不同选项。首先,我们讨论了基于正则表达式和纯Java的解决方案。随后,我们展示了Guava提供的不同选择。最后,我们以基于Apache Commons Lang 3库的解决方案结束我们的示例。

如往常一样,这些示例的代码可以在GitHub上找到。