在前面講解Kotlin
數據類型的時候,提到了字符串類型,固然關於其定義在前面的章節中已經講解過了。對Kotlin
中的數據類型不清楚的同窗。請參考Kotlin——初級篇(三):數據類型詳解這篇文章。
在這篇文章中,會對字符串(String
)的經常使用操做作出一個講解。好比,字符串的截取、查找、獲取長度、替換等等...html
字符串查找功能在實際開發中,只會用到幾個簡單的函數,這裏我只說明幾個經常使用的。java
val str = "kotlin very good" str.first() <=> str[0] <=> str.get(0)
其還實現了查找等於某一個字符的第一個元素,即first{}
高階函數git
val str = "kotlin very good" // 若是未查找到知足條件的元素,會拋出NoSuchElementException異常 str.first{ it == 'o' }
還有一個firstOrNull()
函數,它和first()
函數的區別在於若是字符串爲空串時,first()
函數會拋出異常,而firstOrNull()
函數會返回null
。固然還有firstOrNull{}
函數,它和first{}
函數的區別在於若是字符串爲空串時,first{}
函數會拋出異常,而firstOrNull{}
函數會返回null
github
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{}
同樣。編程
其實查找元素提供了兩個高階函數find{}
、findLast{}
。不過他們都是對firstOrNull()
或lastOrNull()
函數進行處理。這裏很少做累述。數組
這裏提供查找對應元素下標的幾個函數:函數
indexOf()
: 查找某一個元素或字符串在原字符串中第一次出現的下標。indexLastOf()
: 查找某一個元素或字符串在原字符串中最後一次出現的下標。indexOfFirst{}
: 同indexOf()
indexOfLast{}
: 同indexLastOf()
例:post
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"))
輸出結果爲:ui
1 14 1 7 14 12
若是你有Java
或者其餘語言的編程基礎。相信您對字符串的截取應該不會陌生。您能夠繼續的往下看,就看成是對字符串截取只是的一個鞏固。固然,您也能夠直接的跳過本節內容,由於在Kotlin
中,字符串的截取的函數subString()
是調用了Java
中的subString()
函數。
在Kotlin
中除了調用subString()
函數外,還能夠調用subSequence()
函數,有興趣的朋友能夠去看看源碼。
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
異常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()
、等函數。下面會對這些函數意義進行實例講解。
replace()
函數提供了4個重載函數。他們能實現不一樣的功能
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
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
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
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()
函數中的參數都有大體的瞭解。而且下面的幾個函數也是大體相同的操做。故而下面的幾個函數操做,我只會舉例說明其做用。關於參數的介紹就不做細究了
做用:把知足條件的第一個字符或字符串替換成新的字符或字符串
例:
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
做用:截取知足條件的第一個字符或字符串後面的字符串,包含知足條件字符或字符串自身,並在其前面加上新的字符串。
例:
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
做用:截取知足條件的最後一個字符或字符串後面的字符串,包含知足條件字符或字符串自身,並在其前面加上新的字符串。
例:
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
做用:截取知足條件的第一個字符或字符串前面的字符串,包含知足條件字符或字符串自身,並在其後面加上新的字符串。
例:
val str = "Kotlin is a very good programming language" println(str.replaceAfter('a',"AA")) println(str.replaceAfter("Kotlin","Java"))
輸出結果爲:
Kotlin is aAA KotlinJava
做用:截取知足條件的最後一個字符或字符串前面的字符串,包含知足條件字符或字符串自身,並在其後面加上新的字符串。
例:
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()
函數來分割字符串。分割成功後都會返回一個字符串集合用於咱們後續操做。
split()
函數也是提供了4
個重載函數。其中,用正則表達式爲條件分割佔用兩個。用字符分割佔用一個。用字符串分割佔用一個。
在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
在實際的項目開發中,仍是這種方式用的要多一些。不過這裏值得注意的是,不論是用字符分割,仍是字符串分割,其都是一個可變參數。即其參數的個數不定。
例:
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
此函數一樣能夠用字符串或字符去分割,其用法和上述的split()
函數同樣。這裏就很少累述了...
除了上面講解到的幾點外,還有不少經常使用的處理,好比檢測字符串是否爲空串,是否爲null
,獲取字符串長度,字符串反轉,統計,轉換字符數組,獲取指定下標的字符等等。
在
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 }
上面講到了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
在實際的開發中,特別是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
字符串連接,在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
和數組同樣,字符串也是能夠反轉元素的。直接使用reversed()
函數便可。
例:
val str = "kotlin" println("字符串反轉:${str.reversed()}")
輸出結果:
字符串反轉:niltok
在實際的開發中,判斷字符串的起始與結尾是很經常使用的。
其中:
做用: 判斷其字符串是否由某一個字符或字符串起始。
參數說明:
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
其中:
做用: 判斷其字符串是否由某一個字符或字符串結尾。
參數說明:
char
: 結尾字符suffix
: 結尾字符串ignoreCase
: 是否調用Java
中的此函數。默認爲false
例:
val str = "kotlin" println(str.endsWith("lin")) // 是否由字符串`lin`結尾 println(str.endsWith('n')) // 是否由字符`n`結尾
輸出結果爲:
true true
在實際的項目開發中,字符串的處理使用的狀況是不少的。特別是字符串的驗證處理、替換、分割、截取。這也是我把這些知識點整理出來的緣由。這些知識點是很基礎,但同時也是很經常使用的。若是您有編程經驗的話您就當對字符串的基礎知識的鞏固。
關於kotlin
中字符串的操做就寫到這裏,其實還有不少功能,雖然在開發中用到的地方不是特別多,可是咱們最起碼能應該有個瞭解。有興趣的朋友能夠去看看其源碼的實現。
若是各位大佬看了以後感受還闊以,就請各位大佬隨便star
一下,您的關注是我最大的動力。
個人我的博客:Jetictors
Github:Jteictors
掘金:Jteictors