Kotlin:如何在字符串中的"@"之后获取字符?

Dan*_*ond 9 string android substring string-interpolation kotlin

我有一个电子邮件的字符串.无论字符串/电子邮件是什么,我希望能够获得电子邮件的域名部分.基本上我想要在字符串的@部分之后抓住字符.例如,对于testing@kotlin.com,我在kotlin.com部分之后.

val emailString ="hello@world.com"

Iva*_*oll 23

虽然接受的答案没有任何问题,Kotlin标准库值得探索,因为它包含了很好的小方法,比如substringAfterLast缩短这个例子.

val string = "hello@world.com"

val domain: String? = string.substringAfterLast("@")
Run Code Online (Sandbox Code Playgroud)

  • 不错的发现,尽管[`substringAfterLast`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/substring-after-last.html)不会返回可为空的字符串-默认值为字符串本身。是否需要取决于使用情况。 (3认同)
  • 我比较喜欢这个。在这种情况下,您甚至不需要索引值。 (2认同)

Moi*_*ira 11

注意Ivan Wooll 的回答提出了 using 的观点substringAfterLast,这是一个非常有用的实用程序,但重要的是要记住它不能返回null,而是默认为提供的默认值(这是原始字符串,如果未指定任何内容) )。

我个人更喜欢与负责null在情况下,无效的输入是一个合理的担忧,而不是如一个空字符串,因为它是一个更清晰的迹象表明,分隔符没有被发现,而这种特殊情况下,可以通过链接好办?:?.let,等。

以下是可能不受欢迎的行为的示例:

string           | string.substringAfterLast("@")
-------------------------------------------------
"domain.com"     | "domain.com" !
"@domain.com"    | "domain.com"
"foo@domain.com" | "domain.com"
Run Code Online (Sandbox Code Playgroud)

只是为了完整性:

val string = "hello@world.com"

val index = string.indexOf('@')

val domain: String? = if (index == -1) null else string.substring(index + 1)
Run Code Online (Sandbox Code Playgroud)

这之后分配部分@domain它是否存在,否则null


对于学习,IntelliJ 的 Java -> Kotlin 转换器可能有用。

默认情况下,此快捷方式通常映射到Ctrl+ Alt+ Shift+ K

您甚至可以将其设为扩展属性:

val String.domain: String?
    get() {
        val index = string.indexOf('@')
        return if (index == -1) null else string.substring(index + 1)
    }
Run Code Online (Sandbox Code Playgroud)

然后你就可以做

println("hello@world.com".domain)
Run Code Online (Sandbox Code Playgroud)

您可以将此代码缩短为一行let

string.indexOf('@').let { if (it == -1) null else string.substring(it + 1) }
Run Code Online (Sandbox Code Playgroud)

这是Java 中的一个类似问题