Kotlin——关于字符串(String)常用操作汇总
在前面讲解Kotlin
数据类型的时候,提到了字符串类型,当然关于其定义在前面的章节中已经讲解过了。对Kotlin
中的数据类型不清楚的同学。请参考Kotlin——初级篇(三):数据类型详解这篇文章。
在这篇文章中,会对字符串(String
)的常用操作做出一个讲解。比如,字符串的截取、查找、获取长度、替换等等...
目录
一、字符串查找
字符串查找功能在实际开发中,只会用到几个简单的函数,这里我只说明几个常用的。
1.1、获取第一个元素
val str = "kotlin very good"
str.first() <=> str[0] <=> str.get(0)
复制代码
其还实现了查找等于某一个字符的第一个元素,即first{}
高阶函数
val str = "kotlin very good"
// 如果未查找到满足条件的元素,会抛出NoSuchElementException异常
str.first{ it == 'o' }
复制代码
还有一个firstOrNull()
函数,它和first()
函数的区别在于如果字符串为空串时,first()
函数会抛出异常,而firstOrNull()
函数会返回null
。当然还有firstOrNull{}
函数,它和first{}
函数的区别在于如果字符串为空串时,first{}
函数会抛出异常,而firstOrNull{}
函数会返回null
1.2、 获取最后一个元素
val str = ...
str.last() <==> str.get(lastIndex) <==> str[lastIndex]
其中 lastIndex 是一个拓展属性,其实现是 length - 1
复制代码
同时还实现了查找等于某一个字符的最后一个元素,即last{}
高阶函数
val str = "kotlin very good"
// 如果未查找到满足条件的元素,会抛出NoSuchElementException异常
str.last{ it == 'o' } // 其实从源码中我们发现其是对原字符串反转之后再进行遍历查找满足条件的元素。
复制代码
lastOrNull()
同firstOrNUll()
一样。lastOrNull{}
同firstOrNUll{}
一样。
1.3、查找元素
其实查找元素提供了两个高阶函数find{}
、findLast{}
。不过他们都是对firstOrNull()
或lastOrNull()
函数进行处理。这里不多作累述。
1.3、 查找对应元素的下标
这里提供查找对应元素下标的几个函数:
indexOf()
: 查找某一个元素或字符串在原字符串中第一次出现的下标。indexLastOf()
: 查找某一个元素或字符串在原字符串中最后一次出现的下标。indexOfFirst{}
: 同indexOf()
indexOfLast{}
: 同indexLastOf()
例:
println(str.indexOfFirst { it == 'o' })
println(str.indexOfLast { it == 'o' })
println(str.indexOf('o',0))
println(str.indexOf("very",0))
println(str.lastIndexOf('o'))
println(str.lastIndexOf("good"))
复制代码
输出结果为:
1
14
1
7
14
12
复制代码
二、字符串截取
如果你有Java
或者其他语言的编程基础。相信您对字符串的截取应该不会陌生。您可以继续的往下看,就当作是对字符串截取只是的一个巩固。当然,您也可以直接的跳过本节内容,因为在Kotlin
中,字符串的截取的函数subString()
是调用了Java
中的subString()
函数。
在Kotlin
中除了调用subString()
函数外,还可以调用subSequence()
函数,有兴趣的朋友可以去看看源码。
2.1、 用subString()
函数截取
我们看一看subString()
函数的源码
@kotlin.internal.InlineOnly
public inline fun String.substring(startIndex: Int): String = (this as java.lang.String).substring(startIndex)
@kotlin.internal.InlineOnly
public inline fun String.substring(startIndex: Int, endIndex: Int): String
= (this as java.lang.String).substring(startIndex, endIndex)
public fun String.substring(range: IntRange): String = substring(range.start, range.endInclusive + 1)
复制代码
从以上的源码中我们可以看出,Kotlin
中是使用了Java
中的subString()
函数
其中:
startIndex
参数:截取字符串的开始下标endIndex
参数:截取字符串的结束下标rang
参数,是指一个IntRang
类型
实例:
val str = "Kotlin is a very good programming language"
println("s = ${str.substring(10)}") // 当只有开始下标时,结束下标为length - 1
println(str.substring(0,15))
println(str.substring(IntRange(0,15)))
复制代码
输出结果为:
a very good programming language
Kotlin is a ver
Kotlin is a very
复制代码
注意:
- 使用
subString(startIndex,endIndex)
和subString(rang)
时的区别。可以从上边的结果结合源码可以看出来。 - 切记下标越界的情况。即
StringIndexOutOfBoundsException
异常
2.2、用subSequence()
函数截取
在Kotlin
中除了使用上面讲解到的使用subString()
截取字符串外,还可以使用subSequence()
函数截取。
我们看一看其源码实现:
public fun subSequence(startIndex: Int, endIndex: Int): CharSequence
public fun CharSequence.subSequence(range: IntRange): CharSequence = subSequence(range.start, range.endInclusive + 1)
复制代码
从源码中我们可以看出,其大致和subString()
函数一样,但是其不提供只传递startIndex
的情况
实例:
val str = "Kotlin is a very good programming language"
println(str.subSequence(0,15))
println(str.subSequence(IntRange(0,15)))
复制代码
输出结果为:
Kotlin is a ver
Kotlin is a very
复制代码
三、字符串替换
同上述字符串截取一样,如果您有编程经验,可跳过此节。不过对于字符串替换功能,Kotlin
除了实现Java
中的replace()
ha函数外,还提供了另外的replaceFirst()
、replaceAfter()
、replaceBefore()
、replaceIndent()
、等函数。下面会对这些函数意义进行实例讲解。
3.1、replace()函数
replace()
函数提供了4个重载函数。他们能实现不同的功能
3.1.1、 replace(oldChar,newChar,ignoreCase = false)
其中:
- 作用 : 把原字符串中的某一个字符全部替换成新的字符。然后返回新的字符串
- 参数说明:
oldChar
: 需要替换的字符newChar
: 新的字符ignoreCase
: 是否引用Java
中的replace()
函数。默认值为false
,即用Java
的replace()
函数
例:
// 把字符`a`全部替换为`A`
val str = "Kotlin is a very good programming language"
println(str.replace('a','A'))
复制代码
输出结果为:
Kotlin is A very good progrAmming lAnguAge
复制代码
3.1.2、 replace(oldValue,newValue,ignoreCase = false)
其中:
- 作用 : 把原字符串中的某一个字符全部替换成新的字符。然后返回新的字符串
- 参数说明:
oldValue
: 需要替换的字符串newValue
: 新的字符串ignoreCase
: 是否引用Java
中的replace()
函数。默认值为false
,即用Java
的replace()
函数
例:
// 把字符串`Kotlin`替换成字符串`Java`
val str = "Kotlin is a very good programming language"
println(str.replace("Kotlin","Java"))
复制代码
输出结果为:
Java is a very good programming language
复制代码
3.1.3、 replace(regex,replacement)
其中:
- 作用 : 根据定义的正则规则去匹配源字符串,把满足规则的字符串替换成新的字符串。
- 参数说明:
regex
: 正则表达式replacement
: 新的字符串
例:
// 正则的规则为检测数字,如果为数字则替换成字符串`kotlin`
val str = "1234a kotlin 5678 3 is 4"
println(str.replace(Regex("[0-9]+"),"kotlin"))
复制代码
输出结果为:
kotlina kotlin kotlin kotlin is kotlin
复制代码
3.1.4、replace(regex: Regex, noinline transform: (MatchResult) -> CharSequence)
其中:
- 作用 : 根据定义的正则规则去匹配源字符串,把满足规则的字符串通过
transform{}
高阶函数映射的新字符串替换。- 参数说明:
regex
: 正则表达式transform
: 高阶函数
例:
val str = "1234a kotlin 5678 3 is 4"
val newStr = str.replace(Regex("[0-9]+"),{
"abcd "
})
复制代码
输出结果为:
abcd abcd abcd abcd a kotlin abcd abcd abcd abcd abcd is abcd
复制代码
可以从上述的两个函数中看到两个函数的区别。关于高阶函数
、正则表达式
的知识点可以先自行看资料理解。小生会在后续的章节中补上相关的内容...
经过上面的replace()
函数的讲解。并且对几个重载函数进行了分析。相信大家对replace()
函数中的参数都有大致的了解。并且下面的几个函数也是大致相同的操作。故而下面的几个函数操作,我只会举例说明其作用。关于参数的介绍就不作细究了
3.2、replaceFirst()函数
作用:把满足条件的第一个字符或字符串替换成新的字符或字符串
例:
val str = "Kotlin is a very good programming language"
println(str.replaceFirst('a','A'))
println(str.replaceFirst( "Kotlin","Java"))
复制代码
输出结果为:
Kotlin is A very good programming language
Java is a very good programming language
复制代码
3.3、replaceBefore()函数
作用:截取满足条件的第一个字符或字符串后面的字符串,包含满足条件字符或字符串自身,并在其前面加上新的字符串。
例:
val str = "Kotlin is a very good programming language"
println(str.replaceBefore('a',"AA"))
println(str.replaceBefore("Kotlin","Java"))
复制代码
输出结果为:
AAa very good programming language
JavaKotlin is a very good programming language
复制代码
3.4、replaceBeforeLast()函数
作用:截取满足条件的最后一个字符或字符串后面的字符串,包含满足条件字符或字符串自身,并在其前面加上新的字符串。
例:
val str = "Kotlin is a very good programming language"
println(str.replaceBeforeLast('a',"AA"))
println(str.replaceBeforeLast("Kotlin","Java"))
复制代码
输出结果为:
AAage
JavaKotlin is a very good programming language
复制代码
3.5、replaceAfter()函数
作用:截取满足条件的第一个字符或字符串前面的字符串,包含满足条件字符或字符串自身,并在其后面加上新的字符串。
例:
val str = "Kotlin is a very good programming language"
println(str.replaceAfter('a',"AA"))
println(str.replaceAfter("Kotlin","Java"))
复制代码
输出结果为:
Kotlin is aAA
KotlinJava
复制代码
3.6、replaceAfterLast()函数
作用:截取满足条件的最后一个字符或字符串前面的字符串,包含满足条件字符或字符串自身,并在其后面加上新的字符串。
例:
val str = "Kotlin is a very good programming language"
println(str.replaceAfterLast('a',"AA"))
println(str.replaceAfterLast("Kotlin","Java"))
复制代码
输出结果为:
Kotlin is a very good programming languaAA
KotlinJava
复制代码
四、字符串分割
同上一节一样,Kotlin
除了实现Java
中的split()
函数之外,还提供了splitToSequence()
函数来分割字符串。分割成功后都会返回一个字符串集合用于我们后续操作。
4.1、 split()函数
split()
函数也是提供了4
个重载函数。其中,用正则表达式为条件分割占用两个。用字符分割占用一个。用字符串分割占用一个。
4.1.2、使用正则表达式分割
在Kotlin
中使用正则表达式,使用的是Regex
类,而Java
中使用正则表达式使用的Pattern
类。这里分别举例说明
例:
var str2 = "1 kotlin 2 java 3 Lua 4 JavaScript"
val list3 = str2.split(Regex("[0-9]+"))
for (str in list3){
print("$str \t")
}
println()
val list4 = str2.split(Pattern.compile("[0-9]+"))
for (str in list4){
print("$str \t")
}
复制代码
输出结果为:
kotlin java Lua JavaScript
kotlin java Lua JavaScript
复制代码
4.1.2、使用字符或字符串分割
在实际的项目开发中,还是这种方式用的要多一些。不过这里值得注意的是,不管是用字符分割,还是字符串分割,其都是一个可变参数。即其参数的个数不定。
例:
val str1 = "Kotlin is a very good programming language"
val list1 = str1.split(' ')
for (str in list1){
print("$str \t")
}
println()
val list2 = str1.split(" ")
for (str in list2){
print("$str \t")
}
复制代码
输出结果为:
Kotlin is a very good programming language
Kotlin is a very good programming language
复制代码
这里举例一个可变参数情况的例子:
val str3 = "a b c d e f g h 2+3+4+5"
val list5 = str3.split(' ','+')
for (str in list5){
print("$str \t")
}
复制代码
输出结果为:
a b c d e f g h 2 3 4 5
复制代码
4.2、 splitToSequence()函数
此函数同样可以用字符串或字符去分割,其用法和上述的split()
函数一样。这里就不多累述了...
五、其他
除了上面讲解到的几点外,还有很多常用的处理,比如检测字符串是否为空串,是否为null
,获取字符串长度,字符串反转,统计,转换字符数组,获取指定下标的字符等等。
5.1、 获取字符串长度
在
Kotlin
中用两种获取字符串长度的方法。其实也是一种而已
- 直接用
length
属性获取长度- 用
count()
函数获取,其实count()
函数的做法也是返回了length
长度。
实例:
val str = "kotlin very good"
// 1. 直接用length属性获取
println("str.length => ${str.length}")
// 2. 用count()函数获取
println("str.count() => ${str.count()}")
复制代码
输出结果为:
str.length => 16
str.count() => 16
复制代码
这里我们看一看count()
函数的源码
/**
* Returns the length of this char sequence.
* 其实也就是返回了length属性...
*/
@kotlin.internal.InlineOnly
public inline fun CharSequence.count(): Int {
return length
}
复制代码
5.2、统计重复字符
上面讲到了count()
函数,是返回了length
属性获取字符串的长度。其实源码中还提供了一个叫count{}
的高阶函数,用于统计字符串中重复某个字符的个数。
看一看他的源码
public inline fun CharSequence.count(predicate: (Char) -> Boolean): Int {
var count = 0
for (element in this) if (predicate(element)) count++
return count
}
复制代码
源码解释:该函数接受一个Boolean
类型的Lambda
表达式。然后循环这个字符串,如果我的条件成立,则变量count
自增。循环完成之后返回重复的个数count
实例:
val str = "kotlin very good"
val count = str.count { it == 'o' }
println("count : $count")
复制代码
输出结果为:
count : 3
复制代码
5.3、 验证字符串
在实际的开发中,特别是Android
开发中,会经常遇到验证输入框的内容是否为空串的时候。在Kotlin
中,和Java
一样提供了几个处理这种情况的函数。
下列几个函数都是处理字符串为空串或为空的:
isEmpty()
: 其源码是判断其length
是等于0
,若等于0
则返回true
,反之返回false
。不能直接用于可空的字符串isNotEmpty()
: 其源码是判断其length
是否大于0
,若大于0
则返回true
,反之返回false
。不能直接用于可空的字符串isNullOrEmpty()
: 其源码是判断该字符串是否为null
或者其length
是否等于0
。isBlank()
: 其源码是判断其length
是否等于0
,或者判断其包含的空格数是否等于当前的length
。不能直接用于可空的字符串isNotBlank()
: 其源码是对isBlank()
函数取反。不能直接用于可空的字符串isNotOrBlank()
: 其源码判断该字符串是否为null
。或者调用isBlank()
函数
实例:
val str : String? = "kotlin"
// 可以看出当str为可空变量的时候,isNullOrEmpty()和isNotOrBlank()可以不做直接调用而不做任何处理
,而其他的函数则不行
println(str?.isEmpty())
println(str?.isNotEmpty())
println(str.isNullOrEmpty())
println(str?.isBlank())
println(str?.isNotBlank())
println(str.isNullOrBlank())
复制代码
输出结果为:
false
true
false
false
true
false
复制代码
5.4、字符串连接
字符串链接,在Java
中只能使用+
来链接,当然除了StringBuilder、StringBuffer
除外。而在Kotlin
中除了使用+
以外,还可以使用plus()
函数。其接受任意类型。plus()
函数是一个运算符重载函数。在前面的章节中讲解过了。若你对Kotlin
中的云素福重载不了解,您可以查看我的另一篇文章:Kotlin——初级篇(五):操作符重载一
实例讲解:
val oldStr = "kotlin"
println(oldStr.plus(" very good"))
println(oldStr + " very good")
复制代码
输出结果为:
kotlin very good
kotlin very good
复制代码
5.5、字符串反转
和数组一样,字符串也是可以反转元素的。直接使用reversed()
函数即可。
例:
val str = "kotlin"
println("字符串反转:${str.reversed()}")
复制代码
输出结果:
字符串反转:niltok
复制代码
5.6、判断字符串的起始与结尾
在实际的开发中,判断字符串的起始与结尾是很常用的。
5.6.1、 startsWith()
其中:
作用: 判断其字符串是否由某一个字符或字符串起始。 参数说明:
char
: 起始字符prefix
: 起始字符串ignoreCase
: 是否调用Java
中的此函数。默认为false
startIndex
: 开始位置
例:
val str = "kotlin"
str.startsWith('k') // 是否有字符`k`起始
str.startsWith("Kot") // 是否由字符串`kot`起始
str.startsWith("lin",3) // 当起始位置为3时,是否由字符串`lin`起始
复制代码
输出结果为:
true
true
true
复制代码
5.6.2、endsWith()
其中:
作用: 判断其字符串是否由某一个字符或字符串结尾。 参数说明:
char
: 结尾字符suffix
: 结尾字符串ignoreCase
: 是否调用Java
中的此函数。默认为false
例:
val str = "kotlin"
println(str.endsWith("lin")) // 是否由字符串`lin`结尾
println(str.endsWith('n')) // 是否由字符`n`结尾
复制代码
输出结果为:
true
true
复制代码
总结
在实际的项目开发中,字符串的处理使用的情况是很多的。特别是字符串的验证处理、替换、分割、截取。这也是我把这些知识点整理出来的原因。这些知识点是很基础,但同时也是很常用的。如果您有编程经验的话您就当对字符串的基础知识的巩固。
关于kotlin
中字符串的操作就写到这里,其实还有很多功能,虽然在开发中用到的地方不是特别多,但是我们最起码能应该有个了解。有兴趣的朋友可以去看看其源码的实现。
如果各位大佬看了之后感觉还阔以,就请各位大佬随便star
一下,您的关注是我最大的动力。
我的个人博客:Jetictors
我的github:Jetictors
欢迎各位大佬进群共同研究、探索
QQ群号:497071402
作者:Jetictors
链接:https://juejin.im/post/5b0ae06df265da0db64e3d63
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Kotlin——关于字符串(String)常用操作汇总的更多相关文章
- [PY3]——内置数据结构(3)——字符串及其常用操作
字符串及其常用操作xmind图 字符串的定义 1. 单引号/双引号 In [1]: s1='hello world' In [2]: s1="hello world" 2. 三对单 ...
- 跟着ALEX 学python day2 基础2 模块 数据类型 运算符 列表 元组 字典 字符串的常用操作
声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 模块初始: Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有相 ...
- 超详细!盘点Python中字符串的常用操作
在Python中字符串的表达方式有四种 一对单引号 一对双引号 一对三个单引号 一对三个双引号 a = 'abc' b= "abc" c = '''abc''' d = " ...
- Python字符串的常用操作学习
>>> name = "I love my job!" >>> name.capitalize() #首字母大写 'I love my job! ...
- 字符串的常用操作和方法(Python入门教程)
字符串的常用操作 很好理解 字符串可以用 ' + ' 连接,或者乘一个常数重复输出字符串 字符串的索引操作 通过一对中括号可以找到字符串中的某个字符 可以通过正负数双向操作噢 用一个中括号来实现 为什 ...
- Kotlin——初级篇(八):关于字符串(String)常用操作汇总
在前面讲解Kotlin数据类型的时候,提到了字符串类型,当然关于其定义在前面的章节中已经讲解过了.对Kotlin中的数据类型不清楚的同学.请参考Kotlin--初级篇(三):数据类型详解这篇文章. 在 ...
- java 字符串(String)常用技巧及自建方法模块汇总
1.String类常用方法汇总 (1)删除字符串的头尾空白符 public String trim() (2)从指定位置截取字符串 public String substring(int beginI ...
- day1_python之字符串的常用操作
python字符串操作常用操作,如字符串的替换.删除.截取.复制.连接.比较.查找.分割等,需要的朋友可以参考下. 1.去除空格 str.strip():删除字符串两边的指定字符,括号的写入指定字符, ...
- C#字符串的常用操作
一.string关键字与StringBuilder类 C# 字符串是使用 string 关键字声明的一个字符数组.字符串是使用引号声明的,如下例所示: string s = "Hello, ...
随机推荐
- hdu 1693 : Eat the Trees 【插头dp 入门】
题目链接 题意: 给出一个n*m大小的01矩阵,在其中画线连成封闭图形,其中对每一个值为1的方格,线要恰好穿入穿出共两次,对每一个值为0的方格,所画线不能经过. 参考资料: <基于连通性状态压缩 ...
- PHP PSR标准规范
PHP PSR标准规范,PHP开发者都需要遵循规范. 官网(英文版本): https://www.php-fig.org 官网(中文版本): https://psr.phphub.org
- ARP(Address Resolution Protocol)地址解析协议初识
ARP址解析协议是根据IP地址获取物理地址的一个TCP/IP协议.它工作在OSI七层模型的中第二层——数据链路层. 使用ARP地址解析协议,可根据网络层IP数据包包头中的IP地址信息解析出目标硬件地址 ...
- if isinstance(obj, int):
http://legacy.python.org/dev/peps/pep-0008/ Object type comparisons should always use isinstance() i ...
- linux使用apache发布静态html网页
环境 centOS7+httpd 安装httpd 安装 #检查是否安装和httpd rpm -qa | grep httpd #如果没安装 yum -y install httpd 启动httpd并验 ...
- 慎用create table as select,一定要注意默认值的问题
再做一些数据迁移时候,很多人会使用create table as select * from table where id=-1的方式来年建立一摸一样的表,但是这样做有个很大的弊端,不能将原表中的d ...
- vue.js + element 搭建后台管理系统 笔记(一)
此文仅记录本人在搭建后台系统过程中遇到的难点及注意点,如果能帮到各位自然是极好的~~~ 项目主要架构:vueJS.elementUI.scss 一.项目初始化 首先需要安装nodejs,安装方法就不在 ...
- EF框架之——Code First以及踩过的这些“坑”
传送门 Code First使用步骤 Code First报错和解决办法 以前在上海做了一段时间的Asp.net,基本用的都是.net自带的EF框架连接数据库,不过都是用的Model First,最近 ...
- postman的下载和使用
postman的下载 官网:https://www.getpostman.com/downloads/ 创建账号或者用谷歌浏览器账号登录 登录之后,进行接口测试,这里请求百度为例,然后点击send,就 ...
- Naive Bayes Algorithm And Laplace Smoothing
朴素贝叶斯算法(Naive Bayes)适用于在Training Set中,输入X和输出Y都是离散型的情况.如果输入X为连续,输出Y为离散,我们考虑使用逻辑回归(Logistic Regression ...