Kotlin 处理字符串和正则表达式(二十一)

news2024/11/28 18:13:11

导读大纲

    • 1.1 处理字符串和正则表达式
      • 1.1.1 分割字符串
      • 1.1.2 正则表达式和三引号字符串
      • 1.1.3 多行三引号字符串
        • IntelliJ IDEA 和 Android Studio 中三重引号字符串内部的语法高亮显示

1.1 处理字符串和正则表达式

  1. Kotlin 字符串与 Java 字符串完全相同

    • 可以将 Kotlin 代码中创建的字符串传递给任何 Java 方法
  2. Kotlin 通过提供多个有用的扩展函数

    • 使处理标准 Java 字符串变得更加轻松愉快

1.1.1 分割字符串

  1. 大家应该对字符串的 split 方法并不陌生
    • 但Java中的split方法对"."不起作用"
      1. 比如 “12.345-6.A”.split(".")并期望得到一个数组 [12, 345-6, A]
    • Java 的 split 方法会返回一个空数组,出现这种情况的原因
      1. split 方法将正则表达式作为参数
        • 根据表达式将字符串拆分成多个字符串
    • 在这里,点(.)是一个正则表达式, 表示任何字符
      title
import java.util.Arrays;
public class Example {
    public static void main(String[] args){
        System.out.println(Arrays.toString("12.345-6 .A".split(".")));
    }
}
==============================================
[]
  1. Kotlin 隐藏这个令人困惑的方法,并提供几个名为 split 的重载扩展作为替代

    • 比如,接收正则表达式的扩展函数
      1. 需要 Regex 或 Pattern 类型的参数值, 而不是字符串
  2. 使用点(.)号或破折号(-)来切割字符串

    • <1> 调用字符串的toRegex()来明确创建正则表达式
      1. Kotlin 使用与 Java 完全相同的正则表达式语法
      2. 这里的模式匹配点或破折号
        • 我们将点号转义以表示我们指的是字面字符,而不是通配符
fun main() {
    println("12.345-6.A".split("\\.|-".toRegex())) // <1>
    // [12, 345, 6, A]
}
  1. 但对于这种简单的情况,您并不需要使用正则表达式
    • Kotlin 中 split 扩展函数的另一个重载
      1. 将任意数量的分隔符作为纯文本字符串
        title
fun main() {
    println("12.345-6.A".split(".", "-"))
    // [12, 345, 6, A]
}

1.1.2 正则表达式和三引号字符串

  1. 任务是将文件的全路径名解析目录、文件名和扩展名

    • 第一种是在String上使用扩展函数
    • 第二种是使用正则表达式
  2. Kotlin 标准库中包含一些函数

    • 用于获取给定分隔符第一次(或最后一次)出现之前(或之后)的子串
    • <1> 文件路径中最后一个斜线符号之前的子串外层目录的路径
    • <2> 最后一个点之后的子串文件扩展名,文件名位于两者之间
fun parsePath(fullPath: String) {
    val dir = fullPath.substringBeforeLast("/")            // <1>
    val filePath = fullPath.substringAfterLast("/")        
    val fileName = filePath.substringBefore(".")           
    val ext = fullPath.substringAfter(".")                 // <2>
    println(listOf(dir, fileName, ext))
}
fun main() {
    parsePath("/Users/w2starts/kotlin/123.md")
    // Dir: /Users/w2starts/kotlin, name: 123, ext: md
}
  1. 正则表达式功能强大,但有时在编写之后也很难理解
    • <1> 正则表达式是用三引号字符串写成
      1. 在这样的字符串中,不需要转义任何字符,包括反斜杠
      2. 当你想要匹配字符串中的点(.)号
        • 可以直接使用".“而不是”\."
    • <2> regex.matchEntire函数的结果是可空, 判断匹配成功(结果不是空值)
      1. 将其解构属性的值赋值给相应的变量
fun parsePathRegex(fullPath: String) {
    val regex = """(.+)/(.+)\.(.+)""".toRegex()           // <1>
    val result = regex.matchEntire(fullPath)
    if (result != null) {                                 // <2>
        val (dir, fileName, ext) = result.destructured
        println("Dir: $dir, name: $fileName, ext: $ext")
    }
}
fun main() {
    parsePathRegex("/Users/w2starts/kotlin/123.md")
    // Dir: /Users/w2starts/kotlin, name: 123, ext: md
}
  1. 该正则表达式将路径分为三组,中间用斜线和点隔开
    • 模式**"."匹配从开头开始的任何字符**
      1. 因此第一组 (.+)包含最后一条斜线之前的子串
      2. 这个子串包括斜线之前的所有字符,因为它们匹配"任意字符"模式
    • 同样,第二组包含最后一个点之前(最后一个斜线之后)的子串
    • 第三组包含剩余部分
      title

1.1.3 多行三引号字符串

  1. 使用三引号字符串的目的不仅仅是为了避免转义字符
    • 这种字符串字面量可以包含任何字符,包括换行符
      1. 这样就可以轻松地在程序中嵌入包含换行符的文本
    • <1> 多行字符串包含三个引号之间的所有字符
      1. 包括用于格式化代码的换行和缩进
    • <2> 通过调用 trimIndent,可以移除字符串中所有行的缩进
      1. 移除字符串的首行和末行(因为它们是空白的)
// <1>
val hhh =                       
    """
| //
|//
|/ \
""".trimIndent()                   // <2>
fun main() {
    println(hhh)
    // | //
    // |//
    // |/ \
}
  1. 不同的操作系统使用不同的字符来标记文件的行尾

    • Windows 使用 CRLF(回车换行),Linux 和 macOS 使用LF(换行)
    • 无论使用哪种操作系统,Kotlin 都会将 CRLF、LF 和 CR 解释为换行符
  2. 三引号字符串可以包含换行符,但是,你也不能使用特殊字符,比如 \n

    • 另一方面,不必转义,Windows风格的路径:“C:\Users\w2starts\kotlin”
      1. 可以写成""“C:\Users\w2starts\kotlin”""
    • 您还可以在多行字符串使用字符串模板
    • 由于多行字符串不支持转义序列
      1. 如果需要在字符串内容中使用美元符号或转义的 Unicode 符号
        • 必须使用嵌入式表达式
    • 使用下面形式正确解释转义符号
      1. 使用 val think = “”“hhh ${”\uD83E\uDD14"}"""
        • 不能直接使用: val think = “”“hhh \uD83E\uDD14"”"
  3. 测试是多行字符串在程序中发挥作用的领域之一

    • 在测试中,执行会产生多行文本(如网页片段或其他结构化文本)的操作
      1. 将结果与预期输出进行比较很常见
    • 多行字符串将预期输出作为测试一部分完美解决方案
      1. 无需笨拙地转义从外部文件加载文本
      2. 只需加上一些引号,将预期的 HTML、XML、JSON 或其他输出放在它们之间
    • <1> 为了更好地格式化,可以使用 trimIndent 函数
val expectedPage = """
<html lang="en">
<head>
<title>A page</title>
</head>
<body>
<p>Hello, Kotlin!</p>
</body>
</html>
""".trimIndent()
val expectedObject = """
{
"name": "Sebastian",
"age": 27,
"homeTown": "Munich"
}
""".trimIndent()
fun main() {
    println(expectedPage)
    println(expectedObject)
}
IntelliJ IDEA 和 Android Studio 中三重引号字符串内部的语法高亮显示
  1. 对 HTML 或 JSON 等格式化文本使用三引号字符串还有一个额外的好处

    • IntelliJ IDEA和Android Studio可以在这些字符串内部提供语法高亮显示
    • 启用高亮功能,请将光标置于字符串内
      1. 然后按 Alt-Enter(或 macOS 上的Option-Return)键
        • 单击浮动的黄色灯泡图标
      2. 然后选择注入语言或引用
        • 比如, 选择字符串中使用的语言类型(如 JSON)
      3. 多行字符串就会变成语法高亮的 JSON
        title
    • 如果您的文本片段碰巧是畸形JSON
      1. 甚至会在 Kotlin 字符串中收到警告和描述性错误信息
  2. 默认情况下, 这种高亮是临时性

    • 指示集成开发环境始终以给定语言注入字符串字面量
      1. 可以使用 @Language(“JSON”) 注解
        title
    • 有关 IntelliJ IDEA 和 Android Studio 中语言注入
      title

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法】哈希映射(C/C++)

目录 算法引入&#xff1a; 算法介绍&#xff1a; 优点&#xff1a; 缺点&#xff1a; 哈希映射实现&#xff1a; map unordered_map 题目链接&#xff1a;“蓝桥杯”练习系统 解析&#xff1a; 代码实现&#xff1a; 哈希映射算法是一种通过哈希函数将键映射到数组索…

JAVA基础语法 Day11

一、Set集合 Set特点&#xff1a;无序&#xff08;添加数据的顺序和获取出的数据顺序不一致&#xff09;&#xff0c;不重复&#xff0c;无索引 public class demo1 {public static void main(String[] args) {//1.创建一个集合//HashSet特点&#xff1a;无序&#xff0c;不重…

Redis: 集群架构,优缺点和数据分区方式和算法

集群 集群指的就是一组计算机作为一个整体向用户提供一组网络资源 我就举一个简单的例子&#xff0c;比如百度&#xff0c;在北京和你在上海访问的百度是同一个服务器吗&#xff1f;答案肯定是不是的&#xff0c;每一个应用可以部署在不同的地方&#xff0c;但是我们提供的服务…

C0010.Qt5.15.2下载及安装方法

1. 下载及安装 Qt 添加链接描述下载地址&#xff1a;http://download.qt.io/ 选择 archive 目录 安装Qt **注意&#xff1a;**本人使用的是Qt5.15.2版本&#xff0c;可以按如下方法找到该版本&#xff1b;

华为OD机试 - 信号发射和接收 - 矩阵(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

【AIGC】AI时代的数据安全:使用ChatGPT时的自查要点

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;法律法规背景中华人民共和国保守秘密法中华人民共和国网络安全法中华人民共和国个人信息保护法遵守法律法规的重要性 &#x1f4af;ChatGPT的数据使用特点ChatGPT数据安全…

华为OD机试 - 分班问题(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

无人机电力巡检:点亮电力巡检新视野!

一、无人机电力巡查的优势 提高巡检效率&#xff1a;无人机可以搭载高清摄像头、红外热像仪等先进设备&#xff0c;实时拍摄和传输图像&#xff0c;帮助巡检人员快速发现潜在问题&#xff0c;如电线破损、绝缘子污损、设备过热等&#xff0c;从而大大缩短了巡检周期。 降低人…

Tiny Transformer:从零开始构建简化版Transformer模型

引言 自然语言处理&#xff08;NLP&#xff09;与计算机视觉&#xff08;CV&#xff09;有显著差异&#xff0c;各自任务的独特性决定了它们适用的模型架构。在CV中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;长期占据主导地位&#xff0c;而在NLP领域&#xff0c;循…

基于微信小程序的四六级词汇+ssm(lw+演示+源码+运行)

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;四六级词汇小程序被用户普遍使用&#xff0c;为方便用户能…

Python入门--判断语句

目录 1. 布尔类型和比较运算符 2. if语句的基本格式 3. if-else语句 4. if-elif-else语句 5. 判断语句的嵌套 6. 应用--猜数字游戏 进行逻辑判断&#xff0c;是生活中常见的行为。同样&#xff0c;在程序中&#xff0c;进行逻辑判断也是最为基础的功能。 1. 布尔类型和比…

OceanBase—02(入门篇——对于单副本单节点,由1个observer扩容为3个observer集群)——之前的记录,当初有的问题未解决,目前新版未尝试

OceanBase—02&#xff08;入门篇——对于单副本单节点&#xff0c;由1个observer扩容为3个observer集群&#xff09;——之前的记录&#xff0c;有的问题未解决&#xff0c;新版未尝试 1、前言—安装单副本单节点集群1.1 docker安装OB 2、查看现有集群情况2.1 进入容器&#x…

设置服务器走本地代理

勾选&#xff1a; 然后&#xff1a; git clone https://github.com/rofl0r/proxychains-ng.git./configure --prefix/home/wangguisen/usr --sysconfdir/home/wangguisen/etcmakemake install# 在最后配置成本地代理地址 vim /home/wangguisen/etc/proxychains.confsocks4 17…

Python编写的贪吃蛇小游戏

安装包 pip install pygame完整代码 import pygame import randompygame.init()# 定义颜色 white (255, 255, 255) black (0, 0, 0) red (213, 50, 80) green (0, 255, 0) blue (50, 153, 213)# 定义屏幕大小 dis_width 800 dis_height 600dis pygame.display.set_mo…

【数据结构】什么是平衡二叉搜索树(AVL Tree)?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;AVL树的概念 &#x1f4cc;AVL树的操作 &#x1f38f;AVL树的插入操作 ↩️右单旋 ↩️↪️右左双旋 ↪️↩️左右双旋 ↪️左单旋 &#x1f38f;AVL树的删…

CTF刷题buuctf

[WUSTCTF2020]颜值成绩查询 拿到相关题目&#xff0c;其实根据功能和参数分析。需要传入一个学号然后进行针对于对应的学号进行一个查询&#xff0c;很可能就会存在sql注入。 其实这道题最难的点&#xff0c;在于过滤了空格&#xff0c;因此我们使用 /**/来过滤空格的限制。…

智能化焊接数据管理系统:系统功能设计与应用场景,OEM定制

在快速发展的工业4.0时代&#xff0c;智能化技术正以前所未有的速度改变着各行各业&#xff0c;其中焊接行业也不例外。随着物联网、大数据、人工智能等技术的不断融合&#xff0c;智能化焊接数据管理系统应运而生&#xff0c;成为提高焊接效率、保障焊接质量、优化生产流程的重…

半监督学习与数据增强(论文复现)

半监督学习与数据增强&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 半监督学习与数据增强&#xff08;论文复现&#xff09;概述算法原理核心逻辑效果演示使用方式 概述 本文复现论文提出的半监督学习方法&#xff0c;半监督学习&…

C题(二)字符串转数字 --- atoi

———————————————————**目录**—————————————————— 一、 atoi函数介绍 功能函数原型使用示例 二、题解之一 三、留言 问题引入&#x1f449; 输入样例&#x1f449; 5 01234 00123 00012 00001 00000 输出样例&#x1f449; 1234 123 …

‌文件名称与扩展名:批量重命名的技巧与指南

在日常的文件管理中&#xff0c;我们经常需要处理大量的文件&#xff0c;这些文件可能有着各种各样的名称和扩展名。为了更好地管理和识别这些文件&#xff0c;批量重命名成为了一项非常实用的技能。能够帮助我们快速整理文件&#xff0c;提高工作效率。本文将深入探讨文件名称…