Tabla de contenido
Cuarto, segmentación de cadenas
6.1 La búsqueda de caracteres está implementada por defecto
6.2 Implementación usando la extensión kotlin
1. Búsqueda de cadenas
En el desarrollo real de la función de búsqueda de cadenas, solo se utilizan unas pocas funciones simples. Aquí solo explico algunas de las más utilizadas.
1.1 Obtener el primer elemento
Contiene principalmente first()
| firstOrNull()
y first{}
| firstOrNull{}
cuatro funciones
first()
|firstOrNull()
- Función: Encuentra el primer elemento de una cadena
- Diferencia: si la cadena es una cadena vacía, la primera generará
NoSuchElementException
una excepción y la última devolveránull
ejemplo:
val str = "kotlin very good"// 如果字符串为空串时,会抛出NoSuchElementException异常
str.first() <=> str[0] <=> str.get(0)// 如果字符串为空串时,会返回nullstr.firstOrNull()
first{}
|firstOrNull{}
- Función: Encuentra el primer elemento igual a un carácter determinado
- Diferencia: no se encuentra ningún elemento que cumpla la condición, el primero arrojará
NoSuchElementException
una excepción y el segundo regresaránull
ejemplo:
val str = "kotlin very good"// 如果未查找到满足条件的元素,会抛出NoSuchElementException异常
str.first{ it == 'o' } // 如果未查找到满足条件的元素,会返回nullstr.firstOrNull
{ it == 'o' }
1.2 Obtener el último elemento
Incluye principalmente cuatro funciones de first()
, firstOrNull()
y first{}
yfirstOrNull{}
last()
ylastOrNull()
- Función: Encuentra el último elemento de una cadena
- Diferencia: si la cadena es una cadena vacía, la primera generará
NoSuchElementException
una excepción y la última devolveránull
ejemplo:
val str = "kotlin very good"// 如果字符串为空串时,会抛出NoSuchElementException异常
// 其中 lastIndex 是一个拓展属性,其实现是
length - 1str.last() <==> str.get(lastIndex) <==> str[lastIndex]// 如果字符串为空串时,会返回nullstr.lastOrNull()
last{}
ylastOrNull{}
- Función: Encuentra el último elemento igual a un carácter determinado
- Diferencia: no se encuentra ningún elemento que cumpla la condición, el primero arrojará
NoSuchElementException
una excepción y el segundo regresaránull
ejemplo:
val str = "kotlin very good"// 如果未查找到满足条件的元素,会抛出NoSuchElementException异常
// 其实从源码中我们发现其是对原字符串反转之后再进行遍历查找满足条件的元素。这样遍历的次数就减少了
str.last{ it == 'o' } // 如果未查找到满足条件的元素,会返回nullstr.lastOrNull{ it == 'o' }
1.3 Buscar elementos
1.3.2, find{} | findLast{}
en realidad proporciona dos funciones de orden superior para encontrar elementos find{}
, findLast{}
. Sin embargo, sus partes internas son todas las llamadas firstOrNull()
y lastOrNull()
funciones para el procesamiento. No hay mucho que decir aquí.
1.3.2 Encuentra el subíndice del elemento correspondiente
indexOf()
: Encuentra el primer subíndice de un elemento o cadena en la cadena original.indexLastOf()
: busque el subíndice de la última aparición de un elemento o cadena en la cadena original.indexOfFirst{}
: mismoindexOf()
indexOfLast{}
: mismoindexLastOf()
ejemplo:
val str = "kotlin very good"
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"))
La salida es:
114171412
2. Intercepción de cuerdas
Si tienes Java
o base de programación en otros lenguajes. Creo que debería estar familiarizado con la interceptación de cadenas. Puede continuar mirando hacia abajo, como una consolidación de la intercepción de cuerdas. Por supuesto, también puede omitir esta sección directamente, porque en Kotlin
, la función de interceptación de cadenas subString()
es llamar a la función Java
en subString()
.
Además Kotlin
de subString()
las funciones de llamada, también puede llamar a subSequence()
las funciones. Los amigos que estén interesados pueden ir a ver el código fuente.
2.1 subString()
Intersección con función
Echemos un vistazo al subString()
código fuente de la función.
@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)
Desde el código fuente anterior, podemos ver que Kotlin
se utiliza la función Java
ensubString()
en:
startIndex
Parámetros: el subíndice de inicio de la cadena interceptadaendIndex
Parámetro: el subíndice final de la cadena interceptadarang
Parámetro, se refiere a unIntRang
tipo, que representa un rango
Ejemplo:
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)))
La salida es:
a very good programming languageKotlin is a verKotlin is a very
Aviso:
- La diferencia entre usar
subString(startIndex,endIndex)
ysubString(rang)
cuando. Se puede ver a partir de los resultados anteriores combinados con el código fuente. - Tenga en cuenta el caso de subíndice fuera de los límites. eso es
StringIndexOutOfBoundsException
anormal
2.2 subSequence()
Intersección con función
Además de usar la cadena de intercepción Kotlin
explicada anteriormente , también puede usar la función de intercepción.subString()
subSequence()
Echemos un vistazo a su implementación fuente:
public fun subSequence(startIndex: Int, endIndex: Int): CharSequence
public fun CharSequence.subSequence(range: IntRange): CharSequence = subSequence(range.start, range.endInclusive + 1)
Desde el código fuente, podemos ver que es más o menos lo subString()
mismo que una función, pero no solo proporciona startIndex
transferencia.
Ejemplo:
val str = "Kotlin is a very good programming language"
println(str.subSequence(0,15))
println(str.subSequence(IntRange(0,15)))
La salida es:
Kotlin is a verKotlin is a very
3. Reemplazo de cuerdas
Al igual que con el truncamiento de cadenas anterior, puede omitir esta sección si tiene experiencia en programación. Sin embargo, para la función de reemplazo de cadenas, además de la función ha en Kotlin
la implementación , también proporciona otras funciones como , , , , etc. El significado de estas funciones se explicará con ejemplos a continuación.Java
replace()
replaceFirst()
replaceAfter()
replaceBefore()
replaceIndent()
3.1, función reemplazar ()
replace()
La función proporciona 4 funciones sobrecargadas. Pueden realizar diferentes funciones.
3.1.1, reemplazar (oldChar, newChar, ignoreCase = falso)
Función: reemplaza todos los caracteres de la cadena original con nuevos caracteres. luego devuelve la nueva cadena
oldChar
: El caracter a ser reemplazadonewChar
: nuevo personajeignoreCase
: Si hacer referencia a la funciónJava
enreplace()
. El valor predeterminado es la funciónfalse
lista paraJava
usarreplace()
ejemplo:
// 把字符`a`全部替换为`A`
val str = "Kotlin is a very good programming language"
println(str.replace('a','A'))
La salida es:
Kotlin is A very good progrAmming lAnguAge
3.1.2, reemplazar (valor antiguo, valor nuevo, caso ignorado = falso)
Función: reemplaza todos los caracteres de la cadena original con nuevos caracteres. luego devuelve la nueva cadena
oldValue
: la cadena a ser reemplazadanewValue
: nueva cadenaignoreCase
: Si hacer referencia a la funciónJava
enreplace()
. El valor predeterminado es la funciónfalse
lista paraJava
usarreplace()
ejemplo:
// 把字符串`Kotlin`替换成字符串`Java`val str = "Kotlin is a very good programming language"
println(str.replace("Kotlin","Java"))
La salida es:
Java is a very good programming language
3.1.3, reemplazar (regex, reemplazo)
Función: haga coincidir la cadena de origen de acuerdo con las reglas regulares definidas y reemplace las cadenas que cumplen con las reglas con cadenas nuevas.
regex
: expresión regularreplacement
: nueva cadena
ejemplo:
// 正则的规则为检测数字,如果为数字则替换成字符串`
kotlin`val str = "1234a kotlin 5678 3 is 4"
println(str.replace(Regex("[0-9]+"),"kotlin"))
La salida es:
kotlina kotlin kotlin kotlin is kotlin
3.1.4, reemplazar (regex: Regex, noinline transform: (MatchResult) -> CharSequence)
- Función: haga coincidir la cadena de origen de acuerdo con las reglas regulares definidas y
transform{}
reemplace las cadenas que satisfacen las reglas con nuevas cadenas asignadas por funciones de orden superior.regex
: expresión regulartransform
: función de orden superior
ejemplo:
val str = "1234a kotlin 5678 3 is 4"
val newStr = str.replace(Regex("[0-9]+"),{"abcd "})
La salida es:
abcd abcd abcd abcd a kotlin abcd abcd abcd abcd abcd is abcd
Puede ver la diferencia entre las dos funciones de las dos funciones anteriores. Puede leer la información por su cuenta para comprender los puntos de conocimiento 高阶函数
sobre . 正则表达式
Xiaosheng agregará contenido relevante en capítulos posteriores...
Después de la explicación de la replace()
función anterior. Y se analizan varias funciones sobrecargadas. Creo que todos replace()
tienen una comprensión general de los parámetros en la función. Y las siguientes funciones son aproximadamente la misma operación. Por lo tanto, en las siguientes operaciones de funciones, solo ilustraré sus funciones con ejemplos. La introducción de los parámetros no se estudiará en detalle.
3.2, reemplazarPrimero()
Función: reemplaza el primer carácter o cadena que cumple la condición con un nuevo carácter o cadena
ejemplo:
val str = "Kotlin is a very good programming language"
println(str.replaceFirst('a','A'))
println(str.replaceFirst( "Kotlin","Java"))
La salida es:
Kotlin is A very good programming languageJava is a very good programming language
3.3, reemplazar antes ()
Función: Interceptar el primer carácter que cumple la condición o la cadena después de la cadena, incluido el carácter que cumple la condición o la propia cadena, y agregar una nueva cadena delante de él.
ejemplo:
val str = "Kotlin is a very good programming language"
println(str.replaceBefore('a',"AA"))
println(str.replaceBefore("Kotlin","Java"))
La salida es:
AAa very good programming languageJavaKotlin is a very good programming language
3.4, reemplazar antes del último ()
Función: Interceptar el último carácter que cumple la condición o la cadena después de la cadena, incluido el carácter que cumple la condición o la propia cadena, y agregar una nueva cadena delante de él.
ejemplo:
val str = "Kotlin is a very good programming language"
println(str.replaceBeforeLast('a',"AA"))
println(str.replaceBeforeLast("Kotlin","Java"))
La salida es:
AAageJavaKotlin is a very good programming language
3.5, reemplazarDespués()
Función: interceptar el primer carácter que cumple la condición o la cadena delante de la cadena, incluido el carácter que cumple la condición o la propia cadena, y agregar una nueva cadena después.
ejemplo:
val str = "Kotlin is a very good programming language"
println(str.replaceAfter('a',"AA"))
println(str.replaceAfter("Kotlin","Java"))
La salida es:
Kotlin is aAAKotlinJava
3.6, reemplazar después del último ()
Función: interceptar el último carácter que cumple la condición o la cadena anterior a la cadena, incluido el carácter o la cadena en sí que cumple la condición, y agregar una nueva cadena después.
ejemplo:
val str = "Kotlin is a very good programming language"
println(str.replaceAfterLast('a',"AA"))
println(str.replaceAfterLast("Kotlin","Java"))
La salida es:
Kotlin is a very good programming languaAAKotlinJava
Cuarto, segmentación de cadenas
Como en la sección anterior, además de las funciones en Kotlin
la implementación , se proporcionan funciones para dividir cadenas. Después de que la división sea exitosa, se devolverá una colección de cadenas para nuestras operaciones posteriores.Java
split()
splitToSequence()
4.1, división ()
split()
La función también proporciona 4
una función sobrecargada. Entre ellos, usar una expresión regular como división condicional ocupa dos. Dividir con personajes para ocupar uno. Dividir con una cuerda ocupa uno.
4.1.1 Usar expresiones regulares para dividir
Kotlin
Para usar una expresión regular en , está usando una clase Regex
y Java
para usar una expresión regular en , está usando Pattern
una clase. Aquí hay ejemplos
ejemplo:
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")
}
La salida es:
kotlin java Lua JavaScript kotlin java Lua JavaScript
4.1.2, use caracteres o cadenas para dividir
En el desarrollo de proyectos reales, este método se usa con más frecuencia. Sin embargo, vale la pena señalar aquí que ya sea que esté dividido por caracteres o por cadenas, es un parámetro variable. Es decir, el número de sus parámetros es indefinido.
ejemplo:
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")
}
La salida es:
Kotlin is a very good programming languageKotlin is a very good programming language
Aquí hay un ejemplo de un caso de parámetro variable:
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")}
La salida es:
a b c d e f g h 2 3 4 5
4.2, dividir en secuencia ()
Esta función también se puede dividir por cadena o carácter, y su uso es el mismo que el de la split()
función anterior. No hay mucho que decir aquí...
5. Otros
Además de los puntos explicados anteriormente, hay muchos procesos de uso común, como detectar si la cadena es una cadena vacía, obtener la longitud de la cadena, invertir la cadena, contar, convertir la matriz de caracteres, obtener el null
carácter del subíndice especificado, etc.
5.1 Obtener la longitud de la cadena
Hay
Kotlin
dos formas de obtener la longitud de una cadena en . en realidad es solo uno
- Obtener la longitud directamente con
length
el atributo- Consíguelo con
count()
una función De hecho,count()
el método de la función también devuelvelength
la longitud.
Ejemplo:
val str = "kotlin very good"// 1. 直接用length属性获取println("str.length => ${str.length}")// 2. 用count()函数获取println("str.count() => ${str.count()}")
La salida es:
str.length => 16str.count() => 16
Aquí echamos un vistazo al count()
código fuente de la función.
/** * Returns the length of this char sequence. * 其实也就是返回了length属性... */
@kotlin.internal.InlineOnly
public inline fun CharSequence.count(): Int
{
return length
}
5.2 Estadísticas de caracteres repetidos
La función mencionada anteriormente count()
es devolver length
la longitud del atributo para obtener la cadena. De hecho, el código fuente también proporciona una count{}
función de orden superior llamada , que se usa para contar el número de caracteres repetidos en una cadena.
/* count{}函数源码 该函数接受一个`Boolean`类型的`Lambda`表达式。然后循环这个字符串,如果我的条件成立,则变量`count`自增。 循环完成之后返回重复的个数`count` */
public inline fun CharSequence.count(predicate: (Char) -> Boolean): Int
{
var count = 0
for (element in this)
if (predicate(element)) count++
return count
}
Ejemplo:
val str = "kotlin very good"
val count = str.count
{ it == 'o' }
println("count : $count")
La salida es:
count : 3
5.3, Cadena de verificación
En el desarrollo real, especialmente en Android
el desarrollo, a menudo se encuentra al verificar si el contenido del cuadro de entrada es una cadena vacía. En Kotlin
, como en , Java
se proporcionan varias funciones para manejar esta situación.
Todas las siguientes funciones manejan cadenas que están vacías o vacías:
isEmpty()
: Su código fuente es para juzgar si eslength
igual0
, si es igual0
, regresarátrue
, de lo contrario regresaráfalse
. No se puede usar directamente con cadenas anulablesisNotEmpty()
length
: Su código fuente es para juzgar si es mayor que0
, si es mayor que ,0
volvertrue
, de lo contrario volverfalse
. No se puede usar directamente con cadenas anulablesisNullOrEmpty()
: Su código fuente es para juzgar si la cadena es o sinull
es igual a .length
0
isBlank()
length
: Su código fuente es para juzgar si es igual0
o para juzgar si el número de espacios que contiene es igual al actuallength
. No se puede usar directamente con cadenas anulablesisNotBlank()
: Su código fuente es paraisBlank()
invertir la función. No se puede usar directamente con cadenas anulablesisNotOrBlank()
: Su código fuente juzga si la cadena esnull
. o llamarisBlank()
a la función
Ejemplo:
val str : String? = "kotlin"
/* 可以看出当str为可空变量的时候,isNullOrEmpty()和isNotOrBlank()可以不做直接调用而不做任何处理 ,而其他的函行 */
str?.isEmpty()
falsestr?.isNotEmpty()
truestr.isNullOrEmpty()
falsestr?.isBlank()
falsestr?.isNotBlank()
truestr.isNullOrBlank() //false
5.4, concatenación de cadenas
Los enlaces de cadena Java
solo se pueden usar +
para enlazar, excepto, por StringBuilder、StringBuffer
supuesto. Además Kotlin
de usar funciones +
, también puede usar plus()
funciones. Acepta cualquier tipo. plus()
función es una función sobrecargada del operador.
Ejemplo de explicación:
val oldStr = "kotlin"
println(oldStr.plus(" very good"))
println(oldStr + " very good")
La salida es:
kotlin very goodkotlin very good
5.5, inversión de cuerdas
Al igual que los arreglos, las cadenas pueden tener sus elementos invertidos. Simplemente use reversed()
la función directamente.
ejemplo:
val str = "kotlin"println("字符串反转:${str.reversed()}")
Resultado de salida:
字符串反转:niltok
5.6 Determinar el inicio y el final de una cadena
5.6.1, comienza con()
Función: juzgar si su cadena comienza con un determinado carácter o cadena.
char
: carácter inicialprefix
: cadena inicialignoreCase
: si llamarJava
a esta función. El valor predeterminado esfalse
startIndex
: Posición de salida
ejemplo:
val str = "kotlin"
println(str.startsWith('k')) // 是否有字符`k`起始
println(str.startsWith("Kot")) // 是否由字符串`kot`起始
println(str.startsWith("lin",3)) // 当起始位置为3时,是否由字符串`lin`起始
La salida es:
truetruetrue
5.6.2, termina con()
Función: juzgar si la cadena termina con un determinado carácter o cadena.
char
: personaje finalsuffix
: cadena finalignoreCase
: si llamarJava
a esta función. El valor predeterminado esfalse
ejemplo:
val str = "kotlin"println(str.endsWith("lin")) // 是否由字符串`lin`结尾
println(str.endsWith('n')) // 是否由字符`n`结尾复制代码
La salida es:
truetrue
Seis, extensión de Kotlin
6.1 La búsqueda de caracteres está implementada por defecto
object StringUtil {
fun lettersCount(str: String): Int {
var count = 0
for (char in str) {
if (char.isLetter()) {
count++
}
}
return count
}
}
6.2 Implementación usando la extensión kotlin
fun String.lettersCount(): Int {
var count = 0
for (char in this) {
if (char.isLetter()) {
count++
}
}
return count
}
6.3 Llamada
val count = "ABC123xyz!@#".lettersCount()
7. Resumen
En el desarrollo real, hay muchas situaciones en las que se procesan y utilizan cadenas. Especialmente el procesamiento de verificación, reemplazo, segmentación e interceptación de cadenas. Es por eso que resolví estos puntos de conocimiento. Estos puntos de conocimiento son muy básicos, pero también se usan con mucha frecuencia. Si tienes experiencia en programación, debes consolidar los conocimientos básicos de cadenas.