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:…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
