文档

Java™ 教程-Java Tutorials 中文版
操作字符串中的字符
Trail: Learning the Java Language
Lesson: Numbers and Strings
Section: Strings

操作字符串中的字符

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) 返回一个新字符串,该字符串是此字符串的子字符串。integer 参数指定第一个字符的索引。这里,返回的子字符串扩展到原始字符串的末尾。

以下代码从 Niagara 回文中获取从索引 11 延伸到但不包括索引 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 类有 replacing (替换) 找到的字符或子字符串的四种方法。他们是:

用于操作字符串的 String 类中的方法
方法 描述
String replace(char oldChar, char newChar) 返回一个新字符串,将此字符串中所有的 oldChar 替换为 newChar 。
String replace(CharSequence target, CharSequence replacement) 将此字符串中与 target 匹配的每个子字符串替换为指定的 replacement 序列。
String replaceAll(String regex, String replacement) 将此字符串中与给定正则表达式匹配的的每一个子字符串替换为给定的 replacement。
String replaceFirst(String regex, String replacement) 将此字符串中与给定正则表达式匹配的的第一个子字符串替换为给定的 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);
    }

    // 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 的返回值来提取文件扩展名 — 也就是说,从字符串的句点到结尾的子字符串。此代码假定文件名中包含句点;如果文件名没有句点,则 lastIndexOf 返回-1,并且 substring 方法抛出 StringIndexOutOfBoundsException

在 Filename 类的扩展方法中使用 lastIndexOf 和 substring。

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


Previous page: Converting Between Numbers and Strings
Next page: Comparing Strings and Portions of Strings