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:…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...