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:…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...