Kotlin 处理字符串和正则表达式(二十一)
导读大纲
- 1.1 处理字符串和正则表达式
- 1.1.1 分割字符串
- 1.1.2 正则表达式和三引号字符串
- 1.1.3 多行三引号字符串
- IntelliJ IDEA 和 Android Studio 中三重引号字符串内部的语法高亮显示
1.1 处理字符串和正则表达式
-
Kotlin 字符串与 Java 字符串完全相同
- 可以将 Kotlin 代码中创建的字符串传递给任何 Java 方法
-
Kotlin 通过提供多个有用的扩展函数
- 使处理标准 Java 字符串变得更加轻松愉快
1.1.1 分割字符串
- 大家应该对字符串的 split 方法并不陌生
- 但Java中的split方法对"."不起作用"
- 比如 “12.345-6.A”.split(".")并期望得到一个数组 [12, 345-6, A]
- 但 Java 的 split 方法会返回一个空数组,出现这种情况的原因是
- split 方法将正则表达式作为参数
- 并根据表达式将字符串拆分成多个字符串
- split 方法将正则表达式作为参数
- 在这里,点(.)是一个正则表达式, 表示任何字符

- 但Java中的split方法对"."不起作用"
import java.util.Arrays;
public class Example {public static void main(String[] args){System.out.println(Arrays.toString("12.345-6 .A".split(".")));}
}
==============================================
[]
-
Kotlin 隐藏这个令人困惑的方法,并提供几个名为 split 的重载扩展作为替代
- 比如,接收正则表达式的扩展函数
- 需要 Regex 或 Pattern 类型的参数值, 而不是字符串
- 比如,接收正则表达式的扩展函数
-
使用点(.)号或破折号(-)来切割字符串
- <1> 调用字符串的toRegex()来明确创建正则表达式
- Kotlin 使用与 Java 完全相同的正则表达式语法
- 这里的模式匹配点或破折号
- 我们将点号转义以表示我们指的是字面字符,而不是通配符
- <1> 调用字符串的toRegex()来明确创建正则表达式
fun main() {println("12.345-6.A".split("\\.|-".toRegex())) // <1>// [12, 345, 6, A]
}
- 但对于这种简单的情况,您并不需要使用正则表达式
- Kotlin 中 split 扩展函数的另一个重载
- 将任意数量的分隔符作为纯文本字符串

- 将任意数量的分隔符作为纯文本字符串
- Kotlin 中 split 扩展函数的另一个重载
fun main() {println("12.345-6.A".split(".", "-"))// [12, 345, 6, A]
}
1.1.2 正则表达式和三引号字符串
-
任务是将文件的全路径名解析为目录、文件名和扩展名
- 第一种是在String上使用扩展函数
- 第二种是使用正则表达式
-
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> 正则表达式是用三引号字符串写成的
- 在这样的字符串中,不需要转义任何字符,包括反斜杠
- 当你想要匹配字符串中的点(.)号时
- 可以直接使用".“而不是”\."
- <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.3 多行三引号字符串
- 使用三引号字符串的目的不仅仅是为了避免转义字符
- 这种字符串字面量可以包含任何字符,包括换行符
- 这样就可以轻松地在程序中嵌入包含换行符的文本
- <1> 多行字符串包含三个引号之间的所有字符
- 这包括用于格式化代码的换行和缩进
- <2> 通过调用 trimIndent,可以移除字符串中所有行的缩进
- 并移除字符串的首行和末行(因为它们是空白的)
- 这种字符串字面量可以包含任何字符,包括换行符
// <1>
val hhh = """
| //
|//
|/ \
""".trimIndent() // <2>
fun main() {println(hhh)// | //// |//// |/ \
}
-
不同的操作系统使用不同的字符来标记文件的行尾
- Windows 使用 CRLF(回车换行),Linux 和 macOS 使用LF(换行)
- 无论使用哪种操作系统,Kotlin 都会将 CRLF、LF 和 CR 解释为换行符
-
三引号字符串可以包含换行符,但是,你也不能使用特殊字符,比如 \n
- 另一方面,不必转义,Windows风格的路径:“C:\Users\w2starts\kotlin”
- 可以写成""“C:\Users\w2starts\kotlin”""
- 您还可以在多行字符串中使用字符串模板
- 由于多行字符串不支持转义序列
- 如果需要在字符串内容中使用美元符号或转义的 Unicode 符号
- 就必须使用嵌入式表达式
- 如果需要在字符串内容中使用美元符号或转义的 Unicode 符号
- 使用下面形式正确解释转义符号
- 使用 val think = “”“hhh ${”\uD83E\uDD14"}"""
- 而不能直接使用: val think = “”“hhh \uD83E\uDD14"”"
- 使用 val think = “”“hhh ${”\uD83E\uDD14"}"""
- 另一方面,不必转义,Windows风格的路径:“C:\Users\w2starts\kotlin”
-
测试是多行字符串在程序中发挥作用的领域之一
- 在测试中,执行会产生多行文本(如网页片段或其他结构化文本)的操作
- 并将结果与预期输出进行比较是很常见的
- 多行字符串是将预期输出作为测试一部分的完美解决方案
- 无需笨拙地转义或从外部文件加载文本
- 只需加上一些引号,将预期的 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 中三重引号字符串内部的语法高亮显示
-
对 HTML 或 JSON 等格式化文本使用三引号字符串还有一个额外的好处
- IntelliJ IDEA和Android Studio可以在这些字符串内部提供语法高亮显示
- 要启用高亮功能,请将光标置于字符串内
- 然后按 Alt-Enter(或 macOS 上的Option-Return)键
- 或单击浮动的黄色灯泡图标
- 然后选择注入语言或引用
- 比如, 选择字符串中使用的语言类型(如 JSON)
- 多行字符串就会变成语法高亮的 JSON

- 然后按 Alt-Enter(或 macOS 上的Option-Return)键
- 如果您的文本片段碰巧是畸形JSON
- 甚至会在 Kotlin 字符串中收到警告和描述性错误信息
-
默认情况下, 这种高亮是临时性的
- 要指示集成开发环境始终以给定语言注入字符串字面量
- 可以使用 @Language(“JSON”) 注解

- 可以使用 @Language(“JSON”) 注解
- 有关 IntelliJ IDEA 和 Android Studio 中语言注入

- 要指示集成开发环境始终以给定语言注入字符串字面量
相关文章:
Kotlin 处理字符串和正则表达式(二十一)
导读大纲 1.1 处理字符串和正则表达式1.1.1 分割字符串1.1.2 正则表达式和三引号字符串1.1.3 多行三引号字符串IntelliJ IDEA 和 Android Studio 中三重引号字符串内部的语法高亮显示 1.1 处理字符串和正则表达式 Kotlin 字符串与 Java 字符串完全相同 可以将 Kotlin 代码中创建…...
一站式大语言模型API调用:快速上手教程
智匠MindCraft是一个强大的AI工具及开发平台,支持多种大语言模型和多模态AI模型。本文将详细介绍如何通过API调用智匠MindCraft中的大语言模型,帮助开发者快速上手。 注册与登录 访问智匠MindCraft官网,注册并登录账号。 进入开发者平台&…...
【TabBar嵌套Navigation案例-新特性页面-代码位置 Objective-C语言】
一、接下来,我们来说这个新特性页面 1.首先,看一下我们的示例程序,这里改一下,加一个叹号, command + R, 好,首先啊,这里边有一个新特性页面,当我这个程序是第一次安装、第一次运行、还有呢、就是当这个应用程序更新的时候,我应该去加载这个新特性页面, 然后呢,这…...
程序员如何提升并保持核心竞争力?——深入钻研、广泛学习与软技能的培养
一、引言 随着人工智能的不断发展,尤其是AIGC系列大语言模型的涌现,AI辅助编程工具正在日益普及,这对程序员的工作方式产生了深刻的影响。面对这一变革,程序员应如何应对?是专注于某个领域深耕细作,还是…...
Linux之Docker虚拟化部署
上传docker安装包 解压安装包 将解压后的docker文件夹移动到/usr/local/文件夹下 docker 启动命令/usr/local/docker/dockerd 但是启动报错,意思是没有docker用户组 创建docker用户组,执行完会生成套接字文件 将套接字文件加入该用户组管理 第二个错误原…...
重构部队信息安全:部队涉密载体建设新策略
一、完善保密体系架构 1. 加强保密规章制度:制定或刷新关于机密信息管理的相关规定,明确机密信息的生成、复制、传输、使用、储存及销毁等核心环节的操作准则与责任分配,确保整个流程的标准化运作。 2. 明确个人保密义务:通过保密…...
使用Node.js的readline模块逐行读取并解析大文件
在Node.js环境中处理大文件是一个常见的需求,尤其是在处理日志文件、数据库导出、或任何形式的大规模文本数据时。由于Node.js是基于事件循环和非阻塞I/O的,它非常适合处理这类任务。然而,直接将整个文件内容加载到内存中可能会导致内存溢出&…...
浅谈软件安全开发的重要性及安全开发实践
在当今数字化时代,软件已成为企业运营的核心驱动力。然而,随着网络环境的日益复杂和黑客技术的不断演进,软件安全问题日益凸显,成为企业不可忽视的重大挑战。本文将从法律法规要求、企业核心数据资产保护、企业信誉等角度…...
在 NodeJs 里面如何获取 APK 的名称和 icon
最近想用 electron 写一个 adb 的可视化客户端,在展示安装的应用时遇到了如何获取 APK 的名称和 icon 的问题。下面就是一些解决问题的思路。 前提:在这里默认大家已经下载好 apk, 下面 localApkPath 就是你下载好的 apk 的路径。 小提示,示…...
基于VirtualBox和Ubuntu的虚拟环境搭建
VirtualBox简介 VirtualBox 是一款开源虚拟机软件。 是由德国 Innotek 公司开发,由Sun Microsystems公司出品的软件,使用Qt编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。简单易用,可虚拟的系统包括Windows&…...
【PHP源码】匿名来信系统H5版本V1.0免费开源
你的匿名来信H5一封你的来信源码/表白祝福短信程序/往来信/传话短信源码支持邮件发信与手机短信发信“你的匿名来信”是最近某音上爆火的一个活动话题,可以通过H5网站,编辑自己想要对某人说的话或者祝福,网站会把您想说的发给您预留的号码&am…...
Prompt技巧总结和示例分享
"Prompt"(提示)在人工智能中通常指的是输入给模型的文本,用于引导模型生成预期的输出。在使用人工智能助手时,有效的提示技巧可以帮助你获得更准确和有用的回答。 以下是一些单轮对话提示时的技巧: 明确具体…...
大厂校招:海能达嵌入式面试题及参考答案
SPI 协议的一些基础知识 SPI(Serial Peripheral Interface)即串行外设接口,是一种高速的、全双工、同步的通信总线。 SPI 主要由四根信号线组成: 时钟线(SCLK):由主设备产生,用于同步数据传输。时钟的频率决定了数据传输的速度。主设备输出 / 从设备输入线(MOSI):主…...
wrk(1) command
文章目录 1.简介2.特点3.格式4.选项5.示例参考文献 1.简介 wrk 是一个现代的 HTTP 压力测试工具,利用现代多线程技术和高效的网络 I/O 处理,能够生成大量的并发请求,用以测试 HTTP 服务器的性能。 它是作为一种更现代的压力测试工具而设计的…...
【小程序 - 大智慧】Expareser 组件渲染框架
目录 问题思考课程目标Web Component类型说明定义组件属性添加 Shadow DOMTemplate and SlotExparser 框架原理自定义组件内置组件 下周计划 问题思考 首先,给大家抛出去几个问题: 前端框架 Vue React 都有自己的组件库,但是并不兼容&#…...
vue + echarts 快速入门
vue echarts 快速入门 本案例即有nodejs和vue的基础,又在vue的基础上整合了echarts Nodejs基础 1、Node简介 1.1、为什么学习Nodejs(了解) 轻量级、高性能、可伸缩web服务器前后端JavaScript同构开发简洁高效的前端工程化 1.2、Nodejs能做什么(了解) Node 打破了…...
服务器几核几G几M是什么意思?如何选择?
服务器几核几G几M是什么意思?我们建站、搭建网络平台都要用到云服务器,不管在腾讯云、阿里云还是别的云服务平台选购,都会接触到服务器配置。云服务器就是把物理服务器(俗称“母鸡”),用虚拟机技术虚拟出多…...
K8S服务发布
一 、服务发布方式对比 二者主要区别在于: 1、部署复杂性:传统的服务发布方式通常涉及手动配置 和管理服务器、网络设置、负载均衡等,过程相对复 杂且容易出错。相比之下,Kubernetes服务发布方式 通过使用容器编排和自动化部署工…...
Allen Institute for Artificial Intelligence (Ai2) 发布开源多模态语言模型 Molmo
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
Html CSS 布局,位置处理 居中 对齐
Html CSS 布局,位置处理 1、居中布局 1、div 让内部div居中对齐 html <div class"container"><div class"item">I am centered!</div> </div>style .container {border: 2px solid rgb(75, 70, 74);border-radius:…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
