1. 概述

在处理字符串中的字符时,我们可能希望根据它们是否属于特定组来分类。例如,在英语字母中,字符要么是元音,要么是辅音。

在这篇教程中,我们将探讨几种检查字符是否为元音的方法。这些方法可以很容易地扩展到其他字符组。

2. 使用 indexOf 方法检查元音

既然我们知道所有的元音,我们可以将它们,包括大小写形式,添加到一个 String 中:

String VOWELS = "aeiouAEIOU";

我们可以使用 String 类的 indexOf 方法来查看字符是否出现:

boolean isInVowelsString(char c) {
    return VOWELS.indexOf(c) != -1;
}

如果字符存在,索引不会是 -1。如果它是 -1,那么这个字符不在元音集合中。让我们测试一下:

assertThat(isInVowelsString('e')).isTrue();
assertThat(isInVowelsString('z')).isFalse();

这里我们在 Java 中使用了一个 char。如果我们的字符是一个单字符 String 对象,我们可以使用不同的实现:

boolean isInVowelsString(String c) {
    return VOWELS.contains(c);
}

它会通过相同的测试:

assertThat(isInVowelsString("e")).isTrue();
assertThat(isInVowelsString("z")).isFalse();

如我们所见,这种方法有一些小的实现开销。但是,我们必须遍历 "vowels" 字符串中的10个可能的元音来确定某个字符是否在组中。

3. 使用 switch 检查元音

相反,我们可以使用 switch 语句,其中每个元音都是一个单独的 case

boolean isVowelBySwitch(char c) {
    switch (c) {
        case 'a':            
        case 'e':           
        case 'i':           
        case 'o':            
        case 'u':            
        case 'A':
        case 'E':            
        case 'I':           
        case 'O':            
        case 'U':
            return true;
        default:
            return false;
    }
}

我们也可以测试这个:

assertThat(isVowelBySwitch('e')).isTrue();
assertThat(isVowelBySwitch('z')).isFalse();

由于 Java 支持在 switch 语句中使用 String,我们也可以用单字符的字符串实现这一点。

4. 使用正则表达式检查元音

虽然我们可以自己实现字符串匹配算法,但 Java 的正则表达式引擎允许我们强大地匹配字符串。

让我们构建一个正则表达式来识别元音:

Pattern VOWELS_PATTERN = Pattern.compile("[aeiou]", Pattern.CASE_INSENSITIVE);

\[] 用于表示字符类。我们只将元音放入这个类的小写形式中,因为我们可以在不区分大小写的情况下匹配它们。

让我们为包含单个字符的 String 对象实现我们的匹配算法:

boolean isVowelByRegex(String c) {
    return VOWELS_PATTERN.matcher(c).matches();
}

让我们测试一下:

assertThat(isVowelByRegex("e")).isTrue();
assertThat(isVowelByRegex("E")).isTrue();

如我们所见,正则表达式是不区分大小写的。

我们应该注意,这需要输入是一个 String,而不是一个字符。尽管我们可以借助 Character 类的 toString 方法将字符转换为 String

assertThat(isVowelByRegex(Character.toString('e'))).isTrue();

使用正则表达式使得处理此类问题的一般情况变得简单。我们可以使用字符类(包括字符范围)指定任何字符组合。

5. 我们应该使用哪种解决方案?

基于 String 的解决方案可能最容易理解,而且性能也不错,因为它在对每个分类的字符进行检查时只需要最多检查10个选项。

然而,通常情况下,我们期望 switch 语句的性能优于 String 查找。

正则表达式解决方案应该性能很好,因为正则表达式在 Pattern 类的编译方法中进行了优化。然而,正则表达式的实现可能更复杂,对于检测元音这样简单的任务,可能不值得增加复杂性。同样,如果我们正在处理 char 值,那么正则表达式需要一些转换,而其他方法则不需要。

然而,使用正则表达式使我们能够实现复杂的表达式来分类字符

6. 总结

在这篇文章中,我们看到了几种不同的方法来判断一个字符是否是元音。我们了解了如何使用包含所有元音的字符串,并且看到了如何实现 switch 语句。

最后,我们看到了如何使用正则表达式来解决这个问题以及其他更一般的情况。

如往常一样,本教程的完整代码可以在 GitHub 上找到。