我有一个字符串,其中包含电子邮件地址。我想无论这个字符串/电子邮件是什么,都能获取到其域名部分。本质上,我想获得字符串中@符号后面的字符。例如,在testing@kotlin.com中,我想要的是kotlin.com部分。
val emailString = "hello@world.com"
我有一个字符串,其中包含电子邮件地址。我想无论这个字符串/电子邮件是什么,都能获取到其域名部分。本质上,我想获得字符串中@符号后面的字符。例如,在testing@kotlin.com中,我想要的是kotlin.com部分。
val emailString = "hello@world.com"
虽然接受的答案没有问题,但是值得探索 Kotlin 标准库,因为它包含了一些很好的小方法,比如substringAfterLast
,可以将示例缩短到这个样子
val string = "hello@world.com"
val domain: String? = string.substringAfterLast("@")
substringAfterLast
方法返回的不是可空字符串,而是默认返回原始字符串本身。这是否合理取决于具体使用情况。 - SalemsubstringAfterLast
的重要性,这是一个非常有用的工具,但需要记住它不能返回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中类似的问题。
以下表达式描述了以分隔符字符x为界限的第二个子字符串
yourText.split('x')[1]