Kotlin: 如何获取字符串中“@”后面的字符?

22

我有一个字符串,其中包含电子邮件地址。我想无论这个字符串/电子邮件是什么,都能获取到其域名部分。本质上,我想获得字符串中@符号后面的字符。例如,在testing@kotlin.com中,我想要的是kotlin.com部分。

val emailString = "hello@world.com"


你尝试过什么来解决这个问题? - Viktor Yakunin
可能是如何在Java中拆分字符串的重复问题。 - Viktor Yakunin
@ViktorYakunin 我知道使用子字符串可能是最好的方法,但我不太熟悉startIndex和endIndex等。 - Daniel Dramond
@ViktorYakunin 我能在同一个文件中同时使用Java和Kotlin吗? - Daniel Dramond
@Fantini 直截了当,感激不尽。 - Daniel Dramond
显示剩余2条评论
3个回答

51

虽然接受的答案没有问题,但是值得探索 Kotlin 标准库,因为它包含了一些很好的小方法,比如substringAfterLast,可以将示例缩短到这个样子

val string = "hello@world.com"

val domain: String? = string.substringAfterLast("@")

2
我更喜欢这个。在这种情况下,你甚至不需要索引值。 - Fabricio Lemos
5
不错的发现,不过 substringAfterLast 方法返回的不是可空字符串,而是默认返回原始字符串本身。这是否合理取决于具体使用情况。 - Salem

13
NoteIvan Wooll的回答提出了使用substringAfterLast的重要性,这是一个非常有用的工具,但需要记住它不能返回null,而是默认返回提供的默认值(如果未指定,则为原始字符串)。

在输入无效时使用null可能是合理的考虑因素,而不是空字符串,因为它更清楚地表明未找到分隔符,可以通过链接?:?.let等轻松处理这种特殊情况。

这里是一个可能不希望发生的行为示例:

string           | string.substringAfterLast("@")
-------------------------------------------------
"domain.com"     | "domain.com" !
"@domain.com"    | "domain.com"
"foo@domain.com" | "domain.com"

为了完整性而言:


val string = "hello@world.com"

val index = string.indexOf('@')

val domain: String? = if (index == -1) null else string.substring(index + 1)

如果存在@符号后面的内容,将其分配给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)
    }

然后你就能做到

println("hello@world.com".domain)

使用 let,您可以将此代码缩短为一行:

string.indexOf('@').let { if (it == -1) null else string.substring(it + 1) }

这里有一个Java中类似的问题



0

以下表达式描述了以分隔符字符x为界限的第二个子字符串

yourText.split('x')[1]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接