Kotlin - 获取从指定索引开始直到另一个指定索引或字符串末尾的子字符串的方法?

bra*_*oob 0 string substring kotlin

例子

val string = "Large mountain"

我想获得一个从“t”字符的索引开始直到“t”+ 7 的索引的子字符串,其中 7 是任意的或字符串的结尾。

val substring = "tain"

假设字符串更大

val string2 = "Large mountain and lake"

我想回来

val substring2 = "tain and l"

如果我尝试 substring(indexOf("t") ,(indexOf("t") + 7) )

在第二种情况下,如果我现在使用“大山”,我会得到索引越界异常。

gid*_*dds 5

我认为没有特别优雅的方法可以做到这一点。

\n

一种相当简短易读的方法是:

\n
val substring = string.drop(string.indexOf(\'t\')).take(7)\n
Run Code Online (Sandbox Code Playgroud)\n

它用于indexOf()定位字符串中的第一个\'t\'字符,然后drop()删除所有前面的字符,并take()从那里取出(最多)7 个字符。

\n

\'t\'但是,它会创建几个临时字符串,如果字符串中没有,则会给出 IllegalArgumentException 。

\n

提高稳健性和效率需要更多代码,例如:

\n
val substring = string.indexOf(\'t\').let {\n    if (it >= 0)\n        string.substring(it, min(it + 7, string.length))\n    else\n        string\n}\n
Run Code Online (Sandbox Code Playgroud)\n

该版本允许您在没有\'t\'(在else分支中)时控制结果;它还避免创建任何临时对象。 \xe2\x80\x82 与之前一样,它用于indexOf()定位第一个\'t\',但随后min()计算出子字符串可以有多长,并substring()一次性生成它。

\n

如果你经常这样做,你当然可以将它放入你自己的函数中,例如:

\n
fun String.substringFrom(char: Char, maxLen: Int)\n    = indexOf(char).let {\n        if (it >= 0)\n            substring(it, min(it + maxLen, length))\n        else\n            this\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

然后你可以用例如调用"Large mountain".substringFrom(\'t\', 7)

\n