之前『WebView 获取 JavaScript 不同类型返回值的注意事项』一文中提到了当返回类型为字符串时,系统会自动给字符串首尾加上双引号 ",那我们使用的时候当然就要把这个多余的双引号给去掉。

今天就来讲讲去除字符串首尾双引号的几种方法。

直接替换

最简单的方式,就是直接利用 String 类的 replace() 方法直接替换双引号:

fun String.trimQuotes() = this.replace("\"", "")

但是此方法十分不推荐,因为它有重大缺陷,当这个字符串内本身就有双引号时(比如 JSON 字符串),也会被替换掉。

所以使用时你需确保字符串内除最外层的多余双引号外任何位置都不包含双引号。

Kotlin 扩展函数

我们知道 Java 中有一个常用的方法 trim(),可以去除字符串首尾的空白字符。Kotlin 给 String 添加了一个带参数的扩展函数:

/**
 * Returns a string having leading and trailing characters from the [chars] array removed.
 */
public fun String.trim(vararg chars: Char): String = trim { it in chars }

那我们就可以利用这个扩展函数实现:

fun String.trimQuotes() = this.trim('\"')

该方法虽然方便,但我同样不推荐。

回想 Java 中的 trim() 方法,它会清除掉前后的所有空白字符,Kotlin 的该扩展函数也是一样,它会清除掉字符串首尾的所有给定字符,即如果你的字符串本身除了本应去除的双引号外,首尾仍有双引号的话,也会被清除掉。

所以使用时你需确保字符串内头尾除最外层的多余双引号外都不包含双引号。

Guava

Kotlin 虽然香,但很多 Java 项目因为各种原因不能轻松接入。不怕,我们还有 Guava,它是来自 Google 的核心 Java 库,是对 Java API 的补充。

private String trimQuotes(String s) {
    return CharMatcher.is('\"').trimFrom(s);
}

看到该方法的名字就知道,它与上方的 Kotlin 扩展函数一样,师出同源,所以也同样需要确保字符串内头尾除最外层的多余双引号外都不包含双引号。

正则

难道就没有仅仅裁剪最外层双引号的方法了吗?

别慌,我们还有正则!

fun String.trimQuotes() = this.replace("^\"|\"$".toRegex(), "")

同样是利用 String 类的 replace() 方法,只需要加上正则表达式去匹配首尾的双引号,就能避免上面的问题。

总结

本文介绍了 4 种去除字符串首尾的双引号的方法,由简入繁,前面的方法虽然简单,但需要考虑实际使用场景,正则能够完美实现需求,但是对于许多开发者来说仍有一定门槛。

开发过程中可以合理选择对应的方法,只要能确保使用时不会触发到上方的注意事项,那用最简单的方法同样能够提高效率。