文档

Java™教程
隐藏目录
操纵字符串中的字符
路径:学习Java语言
课程:数字和字符串
章节:字符串

操作字符串中的字符

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方法
方法 描述
String substring(int beginIndex, int endIndex) 返回一个新字符串,该字符串是此字符串的子字符串。子字符串从指定的beginIndex开始,到索引endIndex - 1处的字符结束。
String substring(int beginIndex) 返回一个新字符串,该字符串是此字符串的子字符串。整数参数指定第一个字符的索引。在这里,返回的子字符串延伸到原始字符串的末尾。

以下代码从Niagara回文字符串中获取从索引11到索引15之前(不包括索引15)的子字符串,即单词"roar":

String anotherPalindrome = "Niagara. O roar again!"; 
String roar = anotherPalindrome.substring(11, 15); 
使用substring方法获取字符串的一部分。

其他操作字符串的方法

以下是几个操作字符串的其他String方法:

String类中用于操作字符串的其他方法
方法 描述
String[] split(String regex)
String[] split(String regex, int limit)
根据指定的字符串参数(包含正则表达式),在此字符串中搜索匹配项,并相应地将其拆分为字符串数组。可选的整数参数指定返回数组的最大大小。正则表达式在标题为“正则表达式”的课程中介绍。
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类中的搜索方法
方法 描述
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。

注意: CharSequence是一个由String类实现的接口。因此,你可以将字符串作为contains()方法的参数使用。

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

String类中几乎没有用于在字符串中插入字符或子字符串的方法。一般来说,这些方法并不需要:你可以通过将从字符串中删除的子字符串与要插入的子字符串连接起来,创建一个新的字符串。

然而,String类确实有四个用于替换已找到的字符或子字符串的方法。它们是:

String类中用于操作字符串的方法
方法 描述
String replace(char oldChar, char newChar) 返回一个新字符串,其中替换了此字符串中所有出现的旧字符为新字符。
String replace(CharSequence target, CharSequence replacement) 用指定的替换序列替换此字符串中与目标序列匹配的每个子字符串。
String replaceAll(String regex, String replacement) 用给定的替换字符串替换此字符串中与给定正则表达式匹配的每个子字符串。
String replaceFirst(String regex, String replacement) 用给定的替换字符串替换此字符串中与给定正则表达式匹配的第一个子字符串。

一个示例

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


注意: 下面的 Filename 类中的方法没有进行错误检查,并且假设它们的参数包含完整的目录路径和带有扩展名的文件名。如果这些方法是生产代码,它们会验证参数的正确性。
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);
    }

    // 获取没有扩展名的文件名
    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 的返回值来提取文件名的扩展名——也就是从句点到字符串末尾的子字符串。这段代码假设文件名中有句点;如果文件名中没有句点,lastIndexOf 返回 -1,然后 substring 方法会抛出 StringIndexOutOfBoundsException 异常。

在 Filename 类的 extension 方法中使用 lastIndexOf 和 substring 的示意图。

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


上一页: 数字和字符串之间的转换
下一页: 比较字符串和字符串的部分内容