2

操纵字符串中的字符

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

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

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

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

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

objects-charAt.gif

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

方法 描述
String substring(int beginIndex, int endIndex) 返回一个新字符串,该字符串是此字符串的子字符串;
子字符串从指定的beginIndex开始,并扩展到索引endIndex - 1处的字符。
String substring(int beginIndex) 返回一个新字符串,该字符串是此字符串的子字符串;
integer参数指定第一个字符的索引;
这里,返回的子字符串延伸到原始字符串的末尾。

以下代码从Niagara palindrome获取从索引11延伸到但不包括索引15的子字符串,这是“roar”一词:

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

objects-substring.gif

操纵字符串的其他方法

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

方法 描述
String[] split(String regex)
String[] split(String regex, int limit)
搜索字符串参数(包含正则表达式)指定的匹配项,并相应地将此字符串拆分为字符串数组;
可选的整数参数指定返回数组的最大大小,正则表达式在标题为“正则表达式”的课程中介绍。
CharSequence subSequence(int beginIndex, int endIndex) 返回一个索引从beginIndexendIndex - 1构造的新字符序列。
String trim() 返回删除了前面和后面的空格的此字符串的副本。
String toLowerCase()
String toUpperCase()
返回转换为小写或大写的此字符串的副本,如果不需要转换,则这些方法返回原始字符串。

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

以下是一些用于在字符串中查找字符或子字符串的其他String方法,String类提供访问器方法,返回特定字符或子字符串在字符串中的位置:indexOf()lastIndexOf()indexOf()方法从字符串的开头向后搜索,而lastIndexOf()方法从字符串的末尾向前搜索,如果未找到字符或子字符串,indexOf()lastIndexOf()将返回-1

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

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

方法 描述
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 replace(char oldChar, char newChar) 返回一个新字符串,该字符串是使用newChar替换此字符串中出现的所有oldChar
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

objects-lastIndexOf.gif

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


上一篇:在数字和字符串之间转换
下一篇:比较字符串和字符串的部分

博弈
2.5k 声望1.5k 粉丝

态度决定一切