# 字符串相关操作

# 1. 字符串判空

  • 是否为空(null):isNull 方法

    详细信息

    isNull 方法来自于 JDK 自带的 Objects 工具类。

    public static 
    boolean isNull(Object obj)
    

    另外,下面的 isEmpty / hashLength / hashText 的判断规则中都涵盖了 is-null 的判断,无需再多加一个 is-null 的判断。

  • 是否为空(empty):isEmpty / hasLength 方法

    详细信息

    isEmpty / hasLength 方法都来自 Spring 框架的 StringUtils 工具类。

    isEmpty 和 hasLength 方法都能实现 empty 的判断。只要字符串是 非空非空串,哪怕其内容无意义(尽是些空格和 tab ),isEmpty 都会返回 false;hashLength 都会返回 true 。

    public static 
    boolean isEmpty(Object str)
    
    public static 
    boolean hasLength(CharSequence str)
    

    伪代码示例如下:

    isEmpty(null)   = true
    isEmpty("")     = true
    isEmpty(" ")    = false
    isEmpty("xxx")  = false
    
    hasLength(null)   = false
    hasLength("")     = false
    hasLength(" ")    = true
    hasLength("xxx")  = true
    
  • 是否为空(blank):hasText 方法

    详细信息

    hasText 方法都来自 Spring 框架的 StringUtils 工具类。

    hasText 方法的 “预期” 是期望字符串中有实际内容,这种情况下它会返回 true 。

    public static 
    boolean hasText(CharSequence str)
    

    伪代码示例如下:

    hasText(null)   = false      
    hasText("")     = false  
    hasText(" ")    = false
    hasText("xxx")  = true
    
  • 判断字符串是否包含空白符:containsWhitespace 方法

    详细信息

    空白符指的是 空格tab

    containsWhitespace 方法都来自 Spring 框架的 StringUtils 工具类。

    public static
    boolean containsWhitespace(String str)
    

    伪代码示例如下:

    containsWhitespace(null)    = false
    containsWhitespace("")      = false
    containsWhitespace("xxx")   = false
    containsWhitespace(" ")     = true
    containsWhitespace("xx yy") = true
    containsWhitespace(" xxx")  = true
    containsWhitespace("xxx ")  = true
    

# 2. 子串的查询、摘出与统计

  • 判断字符串以 xxx 开始/结束:startsWithIgnoreClass / endsIgnoreCase 方法

    startsWithIgnoreClass / endsIgnoreCase 方法

    startsWithIgnoreCase / endsWithIgnoreCase 方法都来自 Spring 框架的 StringUtils 工具类。

    boolean startsWithIgnoreCase(String str, String prefix) 
    boolean endsWithIgnoreCase(String str, String suffix)
    

    顾名思义,它会忽略大小写。

    startsWithIgnoreCase(null,        "hello") = false
    startsWithIgnoreCase("",          "hello") = false
    startsWithIgnoreCase(" ",         "hello") = false
    startsWithIgnoreCase("hello.txt", "hello") = true
    startsWithIgnoreCase("hello.txt", "HELLO") = true
    startsWithIgnoreCase("HELLO.txt", "hello") = true
    
    endsWithIgnoreCase(null,      ".txt") = false
    endsWithIgnoreCase("",        ".txt") = false
    endsWithIgnoreCase(" ",       ".txt") = false
    endsWithIgnoreCase("xxx.txt", ".txt") = true
    endsWithIgnoreCase("xxx.txt", ".TXT") = true
    endsWithIgnoreCase("xxx.TXT", ".txt") = true
    
  • 判断字符串指定位置是否包含 xxx:substringMatch 方法

    详细信息

    substringMatch 方法都来自 Spring 框架的 StringUtils 工具类。

    boolean substringMatch(CharSequence str, int index, CharSequence substring)
    

    index 从 0 开始。

    伪代码:

    substringMatch("hello world", 6, "world") = true
    substringMatch("hello world", 5, "world") = false
    substringMatch("hello world", 7, "world") = false
    substringMatch("hello world", 7, null)    = NPE
    substringMatch(null,          7, "world") = NPE
    substringMatch(null,          7, null)    = NPE
    
  • 获取最后一部分:unqualify 方法

    详细信息

    unqualify 方法都来自 Spring 框架的 StringUtils 工具类。

    获取最后一个 “点” 之后的内容。

    String unqualify(String qualifiedName)
    
    // 同上。可指定分隔符
    String unqualify(String qualifiedName, char separator)
    

    伪代码示例如下:

    unqualify("this.name.is.qualified") = "qualified"
    
    unqualify("this,name,is,qualified", ',') = "qualified"
    
  • 统计 xxx 在字符串中出现次数:countOccurrencesOf 方法

    详细信息

    countOccurrencesOf 方法都来自 Spring 框架的 StringUtils 工具类。

    int countOccurrencesOf(String str, String sub)
    

    伪代码:

    StringUtils.countOccurrencesOf("tom tommy", "om") = 2
    

# 3. 子串的摘除与替换

  • 去除头部/尾部的空白符:trimTrailingWhitespace / trimLeadingWhitespace 方法

    详细信息

    trimTrailingWhitespace / trimLeadingWhitespace 方法都来自 Spring 框架的 StringUtils 工具类。

    String trimLeadingWhitespace(String str)
    String trimTrailingWhitespace(String str)
    

    伪代码示例如下:

    trimLeadingWhitespace("hello")  = "hello"
    trimLeadingWhitespace("  hello")= "hello"
    trimLeadingWhitespace("  ")     = ""
    trimLeadingWhitespace("")       = ""
    trimLeadingWhitespace(null)     = null
    
    trimTrailingWhitespace("hello")   = "hello"
    trimTrailingWhitespace("hello  ") = "hello"
    trimTrailingWhitespace("  ")      = ""
    trimTrailingWhitespace("")        = ""
    trimTrailingWhitespace(null)      = null
    
  • 去除头部和尾部的空白符:trimWhitespace 方法

    详细信息

    trimWhitespace 方法都来自 Spring 框架的 StringUtils 工具类。

    String trimWhitespace(String str)
    
    trimWhitespace("  hello  ") = "hello"
    
  • 去除开头、结尾和中间的空白符:trimAllWhitespace 方法

    详细信息

    trimAllWhitespace 方法都来自 Spring 框架的 StringUtils 工具类。

    String trimAllWhitespace(String str)
    
    trimAllWhitespace("  hello  world  ") = "helloworld"
    
  • 去除头部/尾部的 xxx:trimTrailingCharacter 方法

    详细信息

    trimTrailingCharacter 方法都来自 Spring 框架的 StringUtils 工具类。

    String trimLeadingCharacter(String str, char leadingCharacter)
    String trimTrailingCharacter(String str, char trailingCharacter) 
    

    伪代码示例如下:

    trimLeadingCharacter("hhello", 'h') = "ello"
    trimLeadingCharacter("hello", 'h')  = "ello"
    trimLeadingCharacter("world", 'h')  = "world"
    trimLeadingCharacter("", 'h')       = ""
    trimLeadingCharacter(null, 'h')     = null
    
  • 去除指定内容:delete 方法

    DETAILS

    delete 方法都来自 Spring 框架的 StringUtils 工具类。

    String delete(String inString, String pattern)
    
    delete("hello", "el") = "hlo"
    
  • 去除指定字符:deleteAny 方法

    详细信息

    deleteAny 方法都来自 Spring 框架的 StringUtils 工具类。

    注意,这是删字符,不是删字符串。

    String deleteAny(String inString, String charsToDelete)
    

    伪代码示例如下:

    deleteAny("hello", "hl")  = "eo"
    
  • 替换指定内容:replace 方法

    详细信息

    replace 方法都来自 Spring 框架的 StringUtils 工具类。

    查找并替换指定子串

    String replace(String inString, String oldPattern, String newPattern)
    

    伪代码示例如下:

    replace("hello", "el", "EL")  = "hELlo"
    

# 4. 为了 IO

  • 比较两个路径字符串:pathEquals 方法

    详细信息

    pathEquals 方法都来自 Spring 框架的 StringUtils 工具类。

    会自动处理路径字符串中的 “..” 。

    boolean pathEquals(String path1, String path2)
    

    大小写敏感。

    伪代码示例如下:

    pathEquals("c:/xxx/yyy/zzz", "c:/xxx/hello/../yyy/zzz") = true
    pathEquals("c:/xxx/yyy/zzz", "C:/xxx/hello/../yyy/zzz") = false
    
  • 获得 “干净” 的路径字符串:cleanPath 方法

    详细信息

    cleanPath 方法都来自 Spring 框架的 StringUtils 工具类。

    会优化掉路径字符串中的 “..” 。

    String cleanPath(String path)
    

    伪代码示例如下:

    cleanPath("c:/xxx/hello/../yyy/zzz")  = "c:/xxx/yyy/zzz"
    
  • 获得文件名:getFilename 方法

    详细信息

    getFilename 方法都来自 Spring 框架的 StringUtils 工具类。

    获得文件名,即去掉文件的路径。

    String getFilename(String path)
    

    文件名中会含有后缀。

    伪代码示例如下:

    getFilename("c:/xxx/hello/../yyy/zzz/world.txt")  = "world.txt"
    
  • 获得文件后缀:getFilenameExtendsion 方法

    详细信息

    getFilenameExtension 方法都来自 Spring 框架的 StringUtils 工具类。

    String getFilenameExtension(String path)
    

    伪代码示例如下:

    getFilenameExtension("c:/xxx/hello/../yyy/zzz/world.txt")  = ".txt"
    
  • 获得无后缀文件路径:stripFilenameExtension 方法

    详细信息

    stripFilenameExtension 方法都来自 Spring 框架的 StringUtils 工具类。

    删除文件路径名中的后缀部分,返回一个无后缀的路径字符串。

    String stripFilenameExtension(String path) 
    

    如果路径中有 “..” ,它不会被优化掉。

    伪代码示例如下:

    // = "c:/xxx/hello/../yyy/zzz/world"
    stripFilenameExtension("c:/xxx/hello/../yyy/zzz/world.txt") 
    

# 5. String 转数组集合

  • String 转数组,以逗号分隔:commaDelimitedListToStringArray 方法

    详细信息

    commaDelimitedListToStringArray 方法都来自 Spring 框架的 StringUtils 工具类。

    String[] commaDelimitedListToStringArray(String str)
    

    伪代码示例如下:

    commaDelimitedListToStringArray("xxx,yyy,zzz")    = ["xxx", "yyy", "zzz"]
    commaDelimitedListToStringArray("xxx, yyy, zzz")  = ["xxx", " yyy", " zzz"]
    
  • String 转数组,自定义分隔符:split / delimitedListToStringArray / tokenizeToStringArray 方法

    详细信息

    split / delimitedListToStringArray / tokenizeToStringArray 方法都来自 Spring 框架的 StringUtils 工具类。

    以第二个参数 delimiter 进行切割

    // 注意,这个方法最多只会把字符串切分成 2 份!即,返回值数组的 length 最大为 2 。
    String[] split(String toSplit, String delimiter)
    
    String[] delimitedListToStringArray(String str, String delimiter)
    
    // 分隔符可以指定多个。
    String[] tokenizeToStringArray(String str, String delimiters)
    

    伪代码示例如下:

    split("xxx,yyy,zzz", ",")     = ["xxx", "yyy,zzz"]
    split("xxx, yyy, zzz", ",")   = ["xxx", " yyy, zzz"]
    split("xxx, yyy, zzz", ", ")  = ["xxx", "yyy, zzz"]
    
    delimitedListToStringArray("xxx,yyy,zzz", ",")    = ["xxx", "yyy", "zzz"]
    delimitedListToStringArray("xxx, yyy, zzz", ", ") = ["xxx", "yyy", "zzz"]
    
    tokenizeToStringArray("xxx,yyy:zzz", ",:")  = ["xxx", "yyy", "zzz"]
    tokenizeToStringArray("xxx, yyy, zzz", ", ")= ["xxx", "yyy", "zzz"]
    
  • String 转 Set,以逗号分隔:commaDelimitedListToSet 方法

    详细信息

    commaDelimitedListToSet 方法来自 Spring 框架的 StringUtils 工具类。

    Set<String> commaDelimitedListToSet(String str)
    

    伪代码示例如下:

    commaDelimitedListToSet("xxx,yyy,zzz")  = ["xxx", "yyy", "zzz"]
    commaDelimitedListToSet("xxx, yyy, zzz")= ["xxx", " yyy", " zzz"]
    

# 6. 数组集合转 String

  • 数组转 String,以逗号分隔:arrayToCommaDelimitedString 方法

    详细信息

    arrayToCommaDelimitedString 方法来自 Spring 框架的 StringUtils 工具类。

    String arrayToCommaDelimitedString(Object[] arr)
    

    如果参数类型是 “非 String[]” 类型,这里会隐式地调用它的各个元素的 toString 方法,后再拼接。

    arrayToCommaDelimitedString(["xxx", "yyy", "zzz"])= "xxx,yyy,zzz"
    arrayToCommaDelimitedString(["xxx", " ", "zzz"])  = "xxx, , zzz"
    arrayToCommaDelimitedString(["xxx", "", "zzz"])   = "xxx,,zzz"
    arrayToCommaDelimitedString(["hello", null, "goodbye"]) = "xxx,null,zzz"
    
  • 数组转 String,自定义分隔符:arrayToDelimitedString 方法

    详细信息

    arrayToDelimitedString 方法来自 Spring 框架的 StringUtils 工具类。

    功能同上。以第二个参数(delim)作为分隔符。

    String arrayToDelimitedString(Object[] arr, String delim)
    

    伪代码示例如下:

    arrayTo...(["xxx", "yyy", "zzz"], ":")= "xxx:yyy:zzz"
    arrayTo...(["xxx", " ", "zzz"], ":")  = "xxx: : zzz"
    arrayTo...(["xxx", "", "zzz"], ":")   = "xxx::zzz"
    arrayTo...(["xxx", null, "zzz"], ":") = "xxx:null:zzz"
    
  • 集合转 String,以逗号分隔:collectionToCommaDelimitedString 方法

    详细信息

    collectionToCommaDelimitedString 方法都来自 Spring 框架的 StringUtils 工具类。

    String collectionToCommaDelimitedString(Collection<?> coll) 
    

    伪代码示例如下:

    collectionTo...(["xxx", " ", "zzz"])  = "xxx, , zzz"
    collectionTo...(["xxx", "", "zzz"])   = "xxx,,zzz"
    collectionTo...(["xxx", null, "zzz"]) = "xxx,null,zzz"
    
  • 集合转 String,自定义分隔符:collectionToDelimitedString 方法

    详细信息

    collectionToDelimitedString 方法都来自 Spring 框架的 StringUtils 工具类。

    String collectionToDelimitedString(Collection<?> coll, String delim) 
    

    伪代码示例如下:

    collectionTo...(["xxx", "yyy", "zzz"], ":") = "xxx:yyy:zzz"
    collectionTo...(["xxx", " ", "zzz"], ":")   = "xxx: : zzz"
    collectionTo...(["xxx", "", "zzz"], ":")    = "xxx::zzz"
    collectionTo...(["xxx", null, "zzz"], ":")  = "xxx:null:zzz"
    

# 7. Collection<String> 转 String[]

toStringArray 方法

toStringArray 方法都来自 Spring 框架的 StringUtils 工具类。

String[] toStringArray(Collection<String> collection) 

伪代码示例如下:

toStringArray(["xxx", "yyy", "zzz"])   = ["xxx", "yyy", "zzz"] 

# 8. 转其它

  • 字符串转 TimeZone:parseTimeZoneString 方法

    详细信息

    parseTimeZoneString 方法都来自 Spring 框架的 StringUtils 工具类。

    // 通过解析时区字符串生成时区对象。
    // 常见 TimeZone 字符串见最后。
    TimeZone parseTimeZoneString(String timeZoneString)
    
  • 字符串数组转 Properties:splitArrayElementsIntoProperties 方法

    splitArrayElementsIntoProperties 方法

    splitArrayElementsIntoProperties 方法都来自 Spring 框架的 StringUtils 工具类。

    将字符串数组中的每一项,按照指定分隔符进行切分,并生成 Properties 对象。

    字符串数组中的元素的内容类似于 "key1,value1"

    Properties splitArrayElementsIntoProperties(String[] array, String delimiter)
    

    伪代码示例如下:

    StringUtils.splitArrayElementsIntoProperties([
        "key1,value1", 
        "key2,value2", 
        "key3,value3"
      ], 
      ",")
    

# 9. 操作字符串数组

  • 对数组的每一项执行 trim:trimArrayElements 方法

    详细信息

    trimArrayElements 方法都来自 Spring 框架的 StringUtils 工具类。

    String[] trimArrayElements(String[] array)
    

    返回新数组。

    trimArrayElements(["xxx ", " yyy", " zzz "]) = ["xxx", "yyy", "zzz"]
    
  • 字符串数组后追加内容:addStringToArray 方法

    详细信息

    addStringToArray 方法都来自 Spring 框架的 StringUtils 工具类。

    String[] addStringToArray(String[] array, String str) 
    

    该方法返回新数组。

    伪代码示例如下:

    add...(["xxx", "yyy"], "zzz") = ["xxx", "yyy", "zzz"]
    
  • 字符串数组二合一:concatenateStringArrays / mergeStringArrays 方法

    详细信息

    concatenateStringArrays / mergeStringArrays 方法都来自 Spring 框架的 StringUtils 工具类。

    String[] concatenateStringArrays(String[] array1, String[] array2) 
    
    // 被废弃,建议通过 LinkedHashSet 手动合并两个字符串。
    String[] mergeStringArrays(String[] array1, String[] array2) 
    
    • 返回新数组;

    • concatenateStringArrays:两个数组中有重复的元素,那么,在合并后的新数组中,它也会重复出现;

    • mergeStringArrays:不同于 concatenateStringArrays ,它能去重。

    伪代码示例如下:

    concatenate...(["xxx", "yyy"], ["yyy", "zzz"])  = ["xxx", "yyy", "yyy", "zzz"]
    
    merge...(["xxx", "yyy"], ["yyy", "zzz"])  = ["xxx", "yyy", "zzz"]
    
  • 字符串数组去重:removeDuplicateStrings 方法

    详细信息

    removeDuplicateStrings 方法都来自 Spring 框架的 StringUtils 工具类。

    String[] removeDuplicateStrings(String[] array)
    

    返回新字符串数组。

    伪代码示例如下:

    remove...(["xxx", "yyy", "yyy", "zzz"]) = ["xxx", "yyy", "zzz"]
    
  • 字符串数组排序:sortStringArray 方法

    详细信息

    sortStringArray 方法都来自 Spring 框架的 StringUtils 工具类。

    String[] sortStringArray(String[] array) 
    

    返回排序后的新数组。

    伪代码示例如下:

    sort...(["hello", "world", "goodbye"]) = ["goodbye", "hello", "world"]
    

# a. 附:TimeZone String

TimeZone 地点
"Asia/Shanghai" 中国标准时间 (北京)
"Asia/Hong_Kong" 香港时间 (香港)
"Asia/Taipei" 台北时间 (台北)
"Asia/Seoul" 首尔
"Asia/Tokyo" 日本时间 (东京)
"America/New_York" 美国东部时间 (纽约)
"America/Denver" 美国山区时间 (丹佛)
"America/Costa_Rica" 美国中部时间 (哥斯达黎加)
"America/Chicago" 美国中部时间 (芝加哥)
"America/Mexico_City" 美国中部时间 (墨西哥城)
"America/Regina" 美国中部时间 (里贾纳)
"America/Los_Angeles" 美国太平洋时间 (洛杉矶)
"Pacific/Majuro" 马朱罗
"Pacific/Midway" 中途岛
"Pacific/Honolulu" 檀香山
"America/Anchorage" 安克雷奇
"America/Tijuana" 美国太平洋时间 (提华纳)
"America/Phoenix" 美国山区时间 (凤凰城)
"America/Chihuahua" 奇瓦瓦
"America/Bogota" 哥伦比亚时间 (波哥大)
"America/Caracas" 委内瑞拉时间 (加拉加斯)
"America/Barbados" 大西洋时间 (巴巴多斯)
"America/Manaus" 亚马逊标准时间 (马瑙斯)
"America/St_Johns" 纽芬兰时间 (圣约翰)
"America/Santiago" 圣地亚哥
"America/Argentina/Buenos_Aires" 布宜诺斯艾利斯
"America/Godthab" 戈特霍布
"America/Montevideo" 乌拉圭时间 (蒙得维的亚)
"America/Sao_Paulo" 圣保罗
"Atlantic/South_Georgia" 南乔治亚
"Atlantic/Azores" 亚述尔群岛
"Atlantic/Cape_Verde" 佛得角
"Africa/Casablanca" 卡萨布兰卡
"Europe/London" 格林尼治标准时间 (伦敦)
"Europe/Amsterdam" 中欧标准时间 (阿姆斯特丹)
"Europe/Belgrade" 中欧标准时间 (贝尔格莱德)
"Europe/Brussels" 中欧标准时间 (布鲁塞尔)
"Europe/Sarajevo" 中欧标准时间 (萨拉热窝)
"Africa/Brazzaville" 西部非洲标准时间 (布拉扎维)
"Africa/Windhoek" 温得和克
"Asia/Amman" 东欧标准时间 (安曼)
"Europe/Athens" 东欧标准时间 (雅典)
"Asia/Beirut" 东欧标准时间 (贝鲁特)
"Africa/Cairo" 东欧标准时间 (开罗)
"Europe/Helsinki" 东欧标准时间 (赫尔辛基)
"Asia/Jerusalem" 以色列时间 (耶路撒冷)
"Africa/Harare" 中部非洲标准时间 (哈拉雷)
"Europe/Minsk" 明斯克
"Asia/Baghdad" 巴格达
"Europe/Moscow" 莫斯科
"Asia/Kuwait" 科威特
"Africa/Nairobi" 东部非洲标准时间 (内罗毕)
"Asia/Tehran" 伊朗标准时间 (德黑兰)
"Asia/Baku" 巴库
"Asia/Tbilisi" 第比利斯
"Asia/Yerevan" 埃里温
"Asia/Dubai" 迪拜
"Asia/Kabul" 阿富汗时间 (喀布尔)
"Asia/Karachi" 卡拉奇
"Asia/Oral" 乌拉尔
"Asia/Yekaterinburg" 叶卡捷林堡
"Asia/Calcutta" 加尔各答
"Asia/Colombo" 科伦坡
"Asia/Katmandu" 尼泊尔时间 (加德满都)
"Asia/Almaty" 阿拉木图
"Asia/Rangoon" 缅甸时间 (仰光)
"Asia/Krasnoyarsk" 克拉斯诺亚尔斯克
"Asia/Bangkok" 曼谷
"Asia/Irkutsk" 伊尔库茨克时间 (伊尔库茨克)
"Asia/Kuala_Lumpur" 吉隆坡
"Australia/Perth" 佩思
"Asia/Yakutsk" 雅库茨克时间 (雅库茨克)
"Australia/Darwin" 达尔文
"Australia/Brisbane" 布里斯班
"Asia/Vladivostok" 海参崴时间 (符拉迪沃斯托克)
"Pacific/Guam" 关岛
"Australia/Adelaide" 阿德莱德
"Australia/Hobart" 霍巴特
"Australia/Sydney" 悉尼
"Asia/Magadan" 马加丹时间 (马加丹)
"Pacific/Auckland" 奥克兰
"Pacific/Fiji" 斐济
"Pacific/Tongatapu" 东加塔布