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上找到。