操纵字符串 中的字符

String类具有许多方法来检查字符串 的内容,查找字符串 中的字符或子字符串,更改大小写以及其他任务。

按索引获取字符和子字符串

您可以通过调用charAt()访问器方法来获得字符串 中特定索引处的字符。第一个字符的索引为 0,而最后一个字符的索引为length()-1。例如,以下代码获取字符串 中索引 9 处的字符:

String anotherPalindrome = "Niagara. O roar again!"; 
char aChar = anotherPalindrome.charAt(9);

索引从 0 开始,因此索引 9 处的字符为“ O”,如下图所示:

使用 charAt 方法可获取特定索引处的字符。

如果要从字符串 中获取多个连续字符,则可以使用substring方法。 substring方法具有两个版本,如下表所示:

  • String类中的substring方法*
MethodDescription
String substring(int beginIndex, int endIndex)返回一个新字符串,该字符串 是该字符串 的子字符串。子字符串 从指定的beginIndex开始,并扩展到索引endIndex - 1处的字符。
String substring(int beginIndex)返回一个新字符串,该字符串 是该字符串 的子字符串。整数参数指定第一个字符的索引。在这里,返回的子字符串 延伸到原始字符串 的末尾。

以下代码从 Niagara 回文中获取从索引 11 一直延伸到索引 15(但不包括索引 15)的子字符串,即单词“咆哮”:

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

使用 substring 方法获取字符串 的一部分。

其他处理字符串 的方法

以下是其他几种用于处理字符串 的String方法:

  • String类中用于处理字符串 的其他方法*
MethodDescription
String[] split(String regex)

String[] split(String regex, int limit)
搜索由字符串 参数(包含正则表达式)指定的匹配项,并将该字符串 相应地拆分为字符串 数组。可选的 integer 参数指定返回数组的最大大小。正则表达式包含在标题为“正则表达式”的类中。
CharSequence subSequence(int beginIndex, int endIndex)返回从beginIndex索引直到endIndex-1 构成的新字符序列。
String trim()返回此字符串 的副本,其中删除了前导空格和尾随空格。
String toLowerCase() String toUpperCase()返回此字符串 的副本,转换为小写或大写。如果不需要转换,则这些方法将返回原始字符串。

搜索字符串 中的字符和子字符串

这是其他一些String方法,用于查找字符串 中的字符或子字符串。 String类提供了访问器方法,这些方法返回特定字符或子字符串indexOf()lastIndexOf()的字符串 中的位置。 indexOf()方法从字符串 的开头开始向前搜索,而lastIndexOf()方法从字符串 的末尾开始向前搜索。如果找不到字符或子字符串,则indexOf()lastIndexOf()返回-1.

String类还提供了搜索方法contains,如果字符串 包含特定的字符序列,则返回 true。当您只需要知道字符串 包含一个字符序列,但是精确的位置并不重要时,请使用此方法。

下表描述了各种字符串 搜索方法。

  • String类别中的搜索方法*
MethodDescription
int indexOf(int ch) int lastIndexOf(int ch)返回指定字符的第一个(最后)出现的索引。
int indexOf(int ch, int fromIndex) int lastIndexOf(int ch, int fromIndex)返回指定字符的第一个(最后)出现的索引,从指定的索引向前(向后)搜索。
int indexOf(String str) int lastIndexOf(String str)返回指定子字符串 的第一个(最后)出现的索引。
int indexOf(String str, int fromIndex) int lastIndexOf(String str, int fromIndex)返回指定子字符串 的第一个(最后)出现的索引,从指定的索引向前(向后)搜索。
boolean contains(CharSequence s)如果字符串 包含指定的字符序列,则返回 true。

Note:

CharSequence是由String类实现的interface。因此,可以将字符串 用作contains()方法的参数。

将字符和子字符串 替换为字符串

String类几乎没有用于将字符或子字符串 插入字符串 的方法。通常,不需要它们:您可以通过 String 联从字符串 中删除的子字符串 和要插入的子字符串 来创建新字符串。

String类确实有四种方法来替换找到的字符或子字符串。他们是:

  • String类中用于处理字符串 的方法*
MethodDescription
String replace(char oldChar, char newChar)返回一个新字符串,该字符串 是用 newChar 替换此字符串 中所有出现的 oldChar 的结果。
String replace(CharSequence target, CharSequence replacement)用指定的 Literals 替换序列替换该字符串 中与 Literals 目标序列匹配的每个子字符串。
String replaceAll(String regex, String replacement)用给定的替换项替换该字符串 中与给定的正则表达式匹配的每个子字符串。
String replaceFirst(String regex, String replacement)用给定的替换项替换与给定的正则表达式匹配的此字符串 的第一个子字符串。

An Example

下面的类Filename演示了使用lastIndexOf()substring()隔离文件名的不同部分。

Note:

以下Filename类中的方法不进行任何错误检查,并假定其参数包含完整的目录路径和带 extensions 的文件名。如果这些方法是生产代码,则它们将验证其参数是否正确构造。

public class Filename {
    private String fullPath;
    private char pathSeparator, 
                 extensionSeparator;

    public Filename(String str, char sep, char ext) {
        fullPath = str;
        pathSeparator = sep;
        extensionSeparator = ext;
    }

    public String extension() {
        int dot = fullPath.lastIndexOf(extensionSeparator);
        return fullPath.substring(dot + 1);
    }

    // gets filename without extension
    public String filename() {
        int dot = fullPath.lastIndexOf(extensionSeparator);
        int sep = fullPath.lastIndexOf(pathSeparator);
        return fullPath.substring(sep + 1, dot);
    }

    public String path() {
        int sep = fullPath.lastIndexOf(pathSeparator);
        return fullPath.substring(0, sep);
    }
}

这是一个程序FilenameDemo,它构造一个Filename对象并调用其所有方法:

public class FilenameDemo {
    public static void main(String[] args) {
        final String FPATH = "/home/user/index.html";
        Filename myHomePage = new Filename(FPATH, '/', '.');
        System.out.println("Extension = " + myHomePage.extension());
        System.out.println("Filename = " + myHomePage.filename());
        System.out.println("Path = " + myHomePage.path());
    }
}

这是程序的输出:

Extension = html
Filename = index
Path = /home/user

如下图所示,我们的extension方法使用lastIndexOf在文件名中查找句点(.)的最后一次出现。然后substring使用lastIndexOf的返回值提取文件 extensions-即从句点到字符串 结尾的子字符串。此代码假定文件名中包含句点;如果文件名没有句点,则lastIndexOf返回-1,并且 substring 方法抛出StringIndexOutOfBoundsException

在 Filename 类的扩展方法中使用 lastIndexOf 和子字符串。

另外,请注意extension方法使用dot + 1作为substring的参数。如果句点字符(.)是字符串 的最后一个字符,则dot + 1等于字符串 的 Long 度,它比字符串 的最大索引大一个(因为索引从 0 开始)。这是substring的合法参数,因为该方法接受等于但不大于字符串Long 度的索引,并将其解释为“字符串 的末尾”。