一手遮天 Android - kotlin: 字符串的常用操作

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

一手遮天 Android - kotlin: 字符串的常用操作

示例如下:

/kotlin/Demo4.kt

/**
 * 本例用于演示 kotlin 的字符串的常用操作(查找,替换,截取,分割,空判断,前缀判断,后缀判断,包含判断,其他操作,格式化,正则表达式等)
 */

package com.webabcd.androiddemo.kotlin

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.webabcd.androiddemo.R
import kotlinx.android.synthetic.main.activity_kotlin_helloworld.*
import java.lang.Exception
import java.text.DecimalFormat
import java.util.*
import java.util.regex.Matcher
import java.util.regex.Pattern

class Demo4 : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_kotlin_demo4)

        // 字符串比较
        appendMessage("${"a" == "a"}, ${"a".equals("A", true)}") // true, true

        sample1(); // 字符串的查找、替换、截取、分割
        sample2(); // 正则表达式
        sample3(); // 字符串的空判断,前缀判断,后缀判断,包含判断,其他操作
        sample4(); // 字符串的格式化
    }

    fun sample1() {

        // 查找字符串的相关方法
        // first(), firstOrNull(), first{}, firstOrNull{}, last(), lastOrNull(), last{}, lastOrNull{}
        // find{} 相当于 firstOrNull(), findLast{} 相当于 lastOrNull()
        // indexOf(), indexLastOf()
        // indexOfFirst{} 相当于 indexOf(), indexOfLast{} 相当于 indexLastOf()

        var a: String = "webabcd";
        var b: String = "";
        try {
            // 这个会抛错的,不想抛错的话就用 firstOrNull()
            b.first();
        } catch (ex: Exception) {
            appendMessage(ex.toString()); // java.util.NoSuchElementException: Char sequence is empty.
        }
        appendMessage("${a.first()}, ${b.firstOrNull()}, ${a.firstOrNull{ it == 'e'}}"); // w, null, e

        // substring() 或 subSequence 截取字符串,两个的用法差不多
        var c: String = a.substring(1); // ebabcd
        var d: String = a.substring(2, 4); // ba
        var e: String = a.substring(IntRange(2, 4)); // bda
        // 注:2..4 和 IntRange(2, 4)
        var e2: String = a.substring(2..4); // bda
        appendMessage("$c, $d, $e, $e2");

        // split() 或 splitToSequence() 分割字符串,两个的用法差不多
        var f: List<String> = a.split('e'); // w, babcd
        var g: List<String> = a.split("ab"); // web, cd
        appendMessage("${f[0]}, ${f[1]}, ${g[0]}, ${g[1]}");

        // 字符串替换
        // 第 3 个参数传 true 用于指定忽略大小写
        var h: String = a.replace("B", "xxx", true); // wexxxaxxxcd
        // replaceFirst() - 只替换指定的第一次出现的字符串
        var i: String = a.replaceFirst("B", "xxx", true); // wexxxabcd
        // replaceBefore() - 将指定的第一次出现的字符串的左侧的所有字符串替换为指定的字符串,大小写敏感
        var j: String = a.replaceBefore("b", "xxx"); // xxxbabcd
        // replaceBeforeLast() - 将指定的最后一次出现的字符串的左侧的所有字符串替换为指定的字符串,大小写敏感
        var k: String = a.replaceBeforeLast("b", "xxx"); // xxxbcd
        // replaceAfter() - 将指定的第一次出现的字符串的右侧的所有字符串替换为指定的字符串,大小写敏感
        var l: String = a.replaceAfter("b", "xxx"); // webxxx
        // replaceAfterLast() - 将指定的最后一次出现的字符串的右侧的所有字符串替换为指定的字符串,大小写敏感
        var m: String = a.replaceAfterLast("b", "xxx"); // webabxxx
        appendMessage("$h, $i, $j, $k, $l, $m");
    }

    fun sample2() {

        // 检查字符串是否匹配指定的规则
        val r1 = "^\\d{3}$";
        var a: Boolean = Pattern.compile(r1).matcher("357").matches(); // true
        var b: Boolean = Pattern.compile(r1).matcher("abc").matches(); // false
        appendMessage("$a, $b");

        // 检索匹配指定规则的字符串
        var r2 = """\d{3}""";
        var matcher: Matcher = Pattern.compile(r2).matcher("abc 357 ijk 456 xyz");
        while (matcher.find()) {
            appendMessage(matcher.group()); // 会输出 2 条数据,一个是 357,一个是 456
        }

        // 替换匹配规则的字符串
        var r3 = "\\d+";
        appendMessage("w1eb123456abcd".replace(Regex(r3), "|")); // w|ab|abcd

        // 检索匹配指定规则的字符串,并做自定义拼接
        var r4 = "^(\\d{3}).*(\\d{3})$";
        appendMessage("123abc456defg789".replace(Regex(r4), "$1, $2")); // 123, 789

        // 根据匹配规则分割字符串
        var r5 = "[0-9]+";
        var c: List<String> = "we1ba2b3cd".split(Regex(r5));
        appendMessage("${c[0]}, ${c[1]}, ${c[2]}, ${c[3]}"); // we, ba, b, cd
    }

    fun sample3() {
        // isEmpty() - length 等于 0 则返回 true(可空字符串要先判断不为 null 之后才能调用此方法)
        // isNotEmpty() - length 大于 0 则返回 true(可空字符串要先判断不为 null 之后才能调用此方法)
        // isNullOrEmpty() - 为 null 或者 length 等于 0 则返回 true
        // isBlank() - 去掉空格后的 length 等于 0 则返回 true(可空字符串要先判断不为 null 之后才能调用此方法)
        // isNotBlank() - 去掉空格后的 length 大于 0 则返回 true(可空字符串要先判断不为 null 之后才能调用此方法)
        // isNotOrBlank() - 为 null 或者去掉空格后的 length 等于 0 则返回 true

        // count(), length, count{}
        var a: String = "webabcd"
        appendMessage("${a.count{it == 'b'}}"); // 2

        // reversed() - 反转字符串
        appendMessage("${a.reversed()}"); // dcbabew

        // startsWith(), endsWith()
        // 可以指定起始索引位置,也可以指定是否忽略大小写
        appendMessage("${a.startsWith("web")}, ${a.startsWith("ab", 3)}, ${a.startsWith("WEB", true)}"); // true, true, true

        // contains()
        // 可以指定是否忽略大小写
        appendMessage("${a.contains("a")}, ${a.contains("a", true)}"); // true, true

        // trim(), trimStart(), trimEnd()
        // 可以去掉 \r \n \t 空格之类的
        var b: String = " \n webabcd"
        appendMessage("${b.trim()}"); // webabcd

        // trimMargin() - 去掉开头的指定字符串
        var c: String = "||webabcd"
        appendMessage("${c.trimMargin("||")}"); // webabcd

        // padStart(), padEnd() - 补全字符串
        var d: String = "57";
        appendMessage("${d.padStart(6, '0')}"); // 000057
    }

    fun sample4() {
        // 可以用 plus 或 + 做字符串拼接(其实 plus() 就是 +)
        var a: String = "a".plus("b").plus("c") + "d";
        appendMessage("$a"); // abcd

        // 字符串模板($变量名 或者 ${表达式})
        var b: Int = 1;
        appendMessage("$b, ${ b + 1 }"); // 1, 2

        // 字符串格式化,借用 java 的类实现
        val c: Double = 1234.1;
        val f1 = DecimalFormat("0.000");
        val f2 = DecimalFormat("0.###");
        appendMessage("${f1.format(c)}, ${f2.format(c)}"); // 1234.100, 1234.1
        appendMessage(String.format(Locale.ENGLISH, "%,.2f", c)); // 1,234.10

        // 通过左右各 3 个双引号包围起来的字符串不解释转义符
        var d = """\n"$\n""";
        appendMessage("$d"); // \n"$\n

        // 也可以通过 """""" 定义多行字符串
        var e = """aaa
  bbb
    ccc
        """;
        appendMessage("$e"); // \n"$\n
    }

    fun appendMessage(message: String) {
        textView1.append(message);
        textView1.append("\n");
    }
}

/layout/activity_kotlin_demo4.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

posted @ 2021-05-31 12:08  webabcd  阅读(747)  评论(0编辑  收藏  举报