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

导读大纲

    • 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.destructuredprintln("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.rhkb.cn/news/439488.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R包的安装、加载以及如何查看帮助文档

0x01 如何安装R包 一、通过R 内置函数安装&#xff08;常用&#xff09; 1.安装CRAN的R包 install.packages()是一个用于安装 R 包的重要函数。 语法&#xff1a;install.packages(pkgs, repos getOption("repos"),...) 其中&#xff1a; pkgs&#xff1a;要安…

问题-python-运行报错-SyntaxError: Non-UTF-8 code starting with ‘\xd5‘ in file 汉字编码问题

​ 编码: 把字符转换成字节序列的过程。因为计算机只能处 理二进制数据&#xff0c;所以不能直接处理文本&#xff0c;需要先把文本转换为二进制数据。 解码: 把二进制数据转换成字符的过程。把接收到的数据转换成程序中使用的编码方式。 ​ 这个报错原因就是编码和解码没达成…

【C++ STL】手撕vector,深入理解vector的底层

vector的模拟实现 前言一.默认成员函数1.1常用的构造函数1.1.1默认构造函数1.1.2 n个 val值的构造函数1.1.3 迭代器区间构造1.1.4 initializer_list 的构造 1.2析构函数1.3拷贝构造函数1.4赋值运算符重载 二.元素的插入,删除,查找操作2.1 operator[]重载函数2.2 push_back函数:…

[已解决] Install PyTorch 报错 —— OpenOccupancy 配环境

目录 关于 常见的初始化报错 环境推荐 torch, torchvision & torchaudio cudatoolkit 本地pip安装方法 关于 OpenOccupancy: 语义占用感知对于自动驾驶至关重要&#xff0c;因为自动驾驶汽车需要对3D城市结构进行细粒度感知。然而&#xff0c;现有的相关基准在城市场…

TriLite完成A轮扩展融资:加速AR微型投影仪技术创新与市场拓展

近日,全球领先的AR微型投影仪开发商TriLite宣布成功完成A轮扩展融资,将A轮融资总额提升至超过2000万欧元。这一轮融资不仅彰显了资本市场对TriLite技术实力和市场潜力的高度认可,更为其后续在AR微型投影仪领域的技术研发、产品迭代以及市场拓展提供了坚实的资金保障。以下是…

大厂笔试现已经禁用本地IDE怎么看

如果我说本来面试做题这种事情就是反人类你相信吗&#xff1f; 这个罪恶的源头就是 Google&#xff0c;说是为了选择高素质的计算机编程水平的人才&#xff0c;然后把面试就变成了考试&#xff0c;最大的受益者当然是印度人了。 当把一个考察过程变成标准化的考试过程&#x…

【AI知识点】置信区间(Confidence Interval)

置信区间&#xff08;Confidence Interval, CI&#xff09; 是统计学中用于估计总体参数的范围。它给出了一个区间&#xff0c;并且这个区间包含总体参数的概率等于某个指定的置信水平&#xff08;通常是 90%、95% 或 99%&#xff09;。与点估计不同&#xff0c;置信区间通过区…

Unity Input System自动生成配置

参考视频 创建及配置新输入系统 New Input System&#xff5c;Unity2022.2 最新教程《勇士传说》入门到进阶&#xff5c;4K_哔哩哔哩_bilibili ProjectSettings设置 Unity编辑器菜单栏选择Edit->Project Settings->Player->Other Settings,将Api Compatibility Level…

OpenAI 开发者大会!实时语音功能有API了,GPT-4o支持多模态微调,上下文cache功能上线

家人们&#xff01;十一假期第1天&#xff0c; OpenAI一年一度的开发者大会又来了惹&#xff01;今年的开发者大会分成三部分分别在美国、英国、新加坡三个地点举办&#xff0c;刚刚结束的是第一场。 去年的OpenAI开发者大会公布了GPT-4 Turbo和GPTs&#xff0c;今年没有大更新…

allegro精确画圆形边框

1.显示原点位置&#xff1a; 2.class-subclass依次选择Board Geometry-Outline 3.菜单ADD---Circle,右侧option,依次设置如下&#xff0c;如图可设置为圆心&#xff08;0&#xff0c;0&#xff09;&#xff0c;半径为42mm的边框&#xff0c;不要忘了右键Done&#xff0c;完成绘…

【目标检测】工程机械车辆数据集2690张4类VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2694 标注数量(xml文件个数)&#xff1a;2694 标注数量(txt文件个数)&#xff1a;2694 标注…

《Windows PE》3.2.4节表

节表由多个节表项&#xff08;IMAGE_SECTION_ HEADER&#xff09;组成&#xff0c;每个节表项&#xff08;40个字节&#xff09;记录了 PE中与某个特定的节有关的信息&#xff0c;如节的属性、节 的大小、在文件和内存中的起始位置等。节表中节的数量由字段IMAGE_FILE_HEADER. …

防止错误输入!Excel单元格限制输入内容的三种有效方式

在Excel中&#xff0c;限制单元格输入内容可以帮助避免数据输入错误&#xff0c;确保数据的一致性和准确性。今天小编分享三种方法&#xff0c;可以轻松限制Excel单元格的输入内容&#xff0c;确保数据输入符合预期要求&#xff0c;一起来看看吧&#xff01; 方法一&#xff1a…

el-pagination组件封装

组件使用 源代码&#xff1a; <script setup> import Pagination from /components/pagination/index.vue import {ref} from "vue";const pageNum ref(1) const pageSize ref(10) const total ref(120)function loadData() {// 加载数据 } </script>…

[云] Hands-on with a sample application--DockerCoins 挖矿程序!

DockerCoins 挖矿程序&#xff01;&#x1f4b0;&#x1f433;&#x1f4e6;&#x1f6a2; 不&#xff0c;你不能用 DockerCoins 买咖啡。 DockerCoins 如何工作&#xff1a; 生成一些随机字节&#xff1a; 程序首先生成一串随机的字节数据。这些随机字节用于模拟挖矿过程中的…

R语言绘制散点图

散点图是一种在直角坐标系中用数据点直观呈现两个变量之间关系、可检测异常值并探索数据分布的可视化图表。它是一种常用的数据可视化工具&#xff0c;我们通过不同的参数调整和包的使用&#xff0c;可以创建出满足各种需求的散点图。 常用绘制散点图的函数有plot()函数和ggpl…

算法专题三: 二分查找

目录 1. 朴素版: 二分查找2. 查找排序数组元素第一个和最后一个位置3. 搜索插入位置4. x的平方根5. 山脉数组的峰顶索引6. 寻找旋转数组中的最小值7. 点名 博客主页: 酷酷学!!! 感谢您的关注~ 正文开始 1. 朴素版: 二分查找 题目思路: 仅需根据题意, 找出二段性, 正确更新下标…

躺平成长:微信小程序运营日记第二天

在进行属于生活的开源之后&#xff0c;自己更加感受到自己存在的渺茫&#xff0c;同时更加开始深刻领会&#xff0c;开源的重要性&#xff0c;在开源&#xff0c;开放&#xff0c;创造&#xff0c;再创新的思维模式下&#xff0c;不发布八部金刚功相关的训练视频&#xff0c;自…

课设实验-数据结构-线性表-手机销售

题目&#xff1a; 代码&#xff1a; #include<stdio.h> #include<string.h> #define MaxSize 10 //定义顺序表最大长度 //定义手机结构体类型 typedef struct {char PMod[10];//手机型号int PPri;//价格int PNum;//库存量 }PhoType; //手机类型 //记录手机的顺序…

如何快速切换电脑的ip地址

在当今的数字化时代&#xff0c;IP地址作为网络身份的重要标识&#xff0c;其重要性日益凸显。无论是出于保护个人隐私的需要&#xff0c;还是为了访问特定的网络服务等&#xff0c;快速切换电脑的IP地址已成为许多用户的迫切需求。本文将为你介绍几种实用的方法&#xff0c;帮…