当前位置: 首页 > news >正文

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

相关文章:

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

导读大纲 1.1 处理字符串和正则表达式1.1.1 分割字符串1.1.2 正则表达式和三引号字符串1.1.3 多行三引号字符串IntelliJ IDEA 和 Android Studio 中三重引号字符串内部的语法高亮显示 1.1 处理字符串和正则表达式 Kotlin 字符串与 Java 字符串完全相同 可以将 Kotlin 代码中创建…...

一站式大语言模型API调用:快速上手教程

智匠MindCraft是一个强大的AI工具及开发平台&#xff0c;支持多种大语言模型和多模态AI模型。本文将详细介绍如何通过API调用智匠MindCraft中的大语言模型&#xff0c;帮助开发者快速上手。 注册与登录 访问智匠MindCraft官网&#xff0c;注册并登录账号。 进入开发者平台&…...

【TabBar嵌套Navigation案例-新特性页面-代码位置 Objective-C语言】

一、接下来,我们来说这个新特性页面 1.首先,看一下我们的示例程序,这里改一下,加一个叹号, command + R, 好,首先啊,这里边有一个新特性页面,当我这个程序是第一次安装、第一次运行、还有呢、就是当这个应用程序更新的时候,我应该去加载这个新特性页面, 然后呢,这…...

程序员如何提升并保持核心竞争力?——深入钻研、广泛学习与软技能的培养

一、引言  随着人工智能的不断发展&#xff0c;尤其是AIGC系列大语言模型的涌现&#xff0c;AI辅助编程工具正在日益普及&#xff0c;这对程序员的工作方式产生了深刻的影响。面对这一变革&#xff0c;程序员应如何应对&#xff1f;是专注于某个领域深耕细作&#xff0c;还是…...

Linux之Docker虚拟化部署

上传docker安装包 解压安装包 将解压后的docker文件夹移动到/usr/local/文件夹下 docker 启动命令/usr/local/docker/dockerd 但是启动报错&#xff0c;意思是没有docker用户组 创建docker用户组&#xff0c;执行完会生成套接字文件 将套接字文件加入该用户组管理 第二个错误原…...

重构部队信息安全:部队涉密载体建设新策略

一、完善保密体系架构 1. 加强保密规章制度&#xff1a;制定或刷新关于机密信息管理的相关规定&#xff0c;明确机密信息的生成、复制、传输、使用、储存及销毁等核心环节的操作准则与责任分配&#xff0c;确保整个流程的标准化运作。 2. 明确个人保密义务&#xff1a;通过保密…...

使用Node.js的readline模块逐行读取并解析大文件

在Node.js环境中处理大文件是一个常见的需求&#xff0c;尤其是在处理日志文件、数据库导出、或任何形式的大规模文本数据时。由于Node.js是基于事件循环和非阻塞I/O的&#xff0c;它非常适合处理这类任务。然而&#xff0c;直接将整个文件内容加载到内存中可能会导致内存溢出&…...

浅谈软件安全开发的重要性及安全开发实践

在当今数字化时代&#xff0c;软件已成为企业运营的核心驱动力。然而&#xff0c;随着网络环境的日益复杂和黑客技术的不断演进&#xff0c;软件安全问题日益凸显&#xff0c;成为企业不可忽视的重大挑战。本文将从法律法规要求、企业核心数据资产保护、企业信誉等角度&#xf…...

在 NodeJs 里面如何获取 APK 的名称和 icon

最近想用 electron 写一个 adb 的可视化客户端&#xff0c;在展示安装的应用时遇到了如何获取 APK 的名称和 icon 的问题。下面就是一些解决问题的思路。 前提&#xff1a;在这里默认大家已经下载好 apk, 下面 localApkPath 就是你下载好的 apk 的路径。 小提示&#xff0c;示…...

基于VirtualBox和Ubuntu的虚拟环境搭建

VirtualBox简介 VirtualBox 是一款开源虚拟机软件。 是由德国 Innotek 公司开发&#xff0c;由Sun Microsystems公司出品的软件&#xff0c;使用Qt编写&#xff0c;在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。简单易用&#xff0c;可虚拟的系统包括Windows&…...

【PHP源码】匿名来信系统H5版本V1.0免费开源

你的匿名来信H5一封你的来信源码/表白祝福短信程序/往来信/传话短信源码支持邮件发信与手机短信发信“你的匿名来信”是最近某音上爆火的一个活动话题&#xff0c;可以通过H5网站&#xff0c;编辑自己想要对某人说的话或者祝福&#xff0c;网站会把您想说的发给您预留的号码&am…...

Prompt技巧总结和示例分享

"Prompt"&#xff08;提示&#xff09;在人工智能中通常指的是输入给模型的文本&#xff0c;用于引导模型生成预期的输出。在使用人工智能助手时&#xff0c;有效的提示技巧可以帮助你获得更准确和有用的回答。 以下是一些单轮对话提示时的技巧&#xff1a; 明确具体…...

大厂校招:海能达嵌入式面试题及参考答案

SPI 协议的一些基础知识 SPI(Serial Peripheral Interface)即串行外设接口,是一种高速的、全双工、同步的通信总线。 SPI 主要由四根信号线组成: 时钟线(SCLK):由主设备产生,用于同步数据传输。时钟的频率决定了数据传输的速度。主设备输出 / 从设备输入线(MOSI):主…...

wrk(1) command

文章目录 1.简介2.特点3.格式4.选项5.示例参考文献 1.简介 wrk 是一个现代的 HTTP 压力测试工具&#xff0c;利用现代多线程技术和高效的网络 I/O 处理&#xff0c;能够生成大量的并发请求&#xff0c;用以测试 HTTP 服务器的性能。 它是作为一种更现代的压力测试工具而设计的…...

【小程序 - 大智慧】Expareser 组件渲染框架

目录 问题思考课程目标Web Component类型说明定义组件属性添加 Shadow DOMTemplate and SlotExparser 框架原理自定义组件内置组件 下周计划 问题思考 首先&#xff0c;给大家抛出去几个问题&#xff1a; 前端框架 Vue React 都有自己的组件库&#xff0c;但是并不兼容&#…...

vue + echarts 快速入门

vue echarts 快速入门 本案例即有nodejs和vue的基础&#xff0c;又在vue的基础上整合了echarts Nodejs基础 1、Node简介 1.1、为什么学习Nodejs(了解) 轻量级、高性能、可伸缩web服务器前后端JavaScript同构开发简洁高效的前端工程化 1.2、Nodejs能做什么(了解) Node 打破了…...

服务器几核几G几M是什么意思?如何选择?

服务器几核几G几M是什么意思&#xff1f;我们建站、搭建网络平台都要用到云服务器&#xff0c;不管在腾讯云、阿里云还是别的云服务平台选购&#xff0c;都会接触到服务器配置。云服务器就是把物理服务器&#xff08;俗称“母鸡”&#xff09;&#xff0c;用虚拟机技术虚拟出多…...

K8S服务发布

一 、服务发布方式对比 二者主要区别在于&#xff1a; 1、部署复杂性&#xff1a;传统的服务发布方式通常涉及手动配置 和管理服务器、网络设置、负载均衡等&#xff0c;过程相对复 杂且容易出错。相比之下&#xff0c;Kubernetes服务发布方式 通过使用容器编排和自动化部署工…...

Allen Institute for Artificial Intelligence (Ai2) 发布开源多模态语言模型 Molmo

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Html CSS 布局,位置处理 居中 对齐

Html CSS 布局&#xff0c;位置处理 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:…...

Spring MVC系统学习(二)——Spring MVC的核心类和注解

Spring MVC&#xff08;Model-View-Controller&#xff09;是Spring框架的一个模块&#xff0c;用于构建基于Web的应用程序。它使用模型、视图和控制器分离的设计模式&#xff0c;使得Web开发更加模块化和灵活。在学习Spring MVC时&#xff0c;有几个核心类和注解是非常关键的&…...

conda虚拟环境安装包、依赖同一管理

在 Python 的虚拟环境中&#xff0c;每个环境都是独立的&#xff0c;这意味着即使两个环境需要相同的库&#xff0c;它们也会分别安装各自的副本。这样做是为了避免不同项目之间相互影响&#xff0c;确保每个项目都有一个干净且隔离的环境。 方法一&#xff1a;使用 Conda 的共…...

Unity网络开发记录(四):在unity中进一步封装客户端类

在上一篇文章中&#xff0c;简单的封装了一下服务端中相关的socket对象&#xff0c;为了可以更方便的使用。所以在本篇中&#xff0c;进一步封装一下在unity中的相关客户端类 封装客户端类&#xff0c;首先采用单例模式&#xff0c;然后采用两个队列来存储我们相关的收发信息 p…...

Linux内核中的UART驱动-详解Linux内核UART驱动:结构与功能分析

一、UART概述 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;&#xff0c;即通用异步收发器&#xff0c;是一种串行通信接口&#xff0c;用于在计算机和外部设备之间传输数据。它特别适用于短距离、低速、串行和全双工的数据传输。在Linux内核中&a…...

威胁检测与防范:如何及时、准确对抗安全风险

随着技术的飞速发展&#xff0c;网络空间中的威胁日益多样化、隐蔽化&#xff0c;给个人、企业乃至国家的信息安全带来诸多挑战。面对严峻的网络威胁&#xff0c;传统的防火墙、入侵检测系统&#xff08;IDS&#xff09;等防御手段虽能在一定程度上抵御外部攻击&#xff0c;但依…...

数据结构串的kmp相关(求next和nextval)

傻瓜版&#xff0c;用来演示手算过程&#xff0c;个人理解用的&#xff0c;仅供参考。...

创建游戏暂停菜单

创建用户控件 设置样式 , 加一层 背景模糊 提升UI菜单界面质感 , 按钮用 灰色调 编写菜单逻辑 转到第三人称蓝图 推荐用 Set Input Mode Game And UI , 只用仅UI的话 增强输入响应不了 让游戏暂停的话也可以用 Set Game Paused , 打勾就是暂停 , 不打勾就是继续游戏 , 然后…...

seata服务端部署

1.下载seata 官网下载地址&#xff1a;http://seata.io/zh-cn/blog/download.html 或者下载 作者已经下载的压缩包1.4.0 注意&#xff01;&#xff01;&#xff01; 要参考对应的版本&#xff0c;否则可能出现无法正常启动的情况。 参考文档 下载完毕后解压压缩文件 2.修改配…...

理解Python闭包概念

闭包并不只是一个python中的概念&#xff0c;在函数式编程语言中应用较为广泛。理解python中的闭包一方面是能够正确的使用闭包&#xff0c;另一方面可以好好体会和思考闭包的设计思想。 1.概念介绍 首先看一下维基上对闭包的解释&#xff1a; 在计算机科学中&#xff0c;闭包…...

51单片机的教室智能照明系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块DS1302时钟模块光照传感器红外传感器温度传感器LED等模块构成。适用于教室灯光全自动控制、教室节能灯控制、教室智能照明等相似项目。 可实现功能: 1、LCD1602实时显示时间、温度、光照强度等信息 2、光照强度传…...

律师网站建设/电脑优化软件推荐

2004年2月28日&#xff0c;在浙江大学软件学院和CSDN网站的大力支持下&#xff0c;ERPTAO组织在浙大成功地举办了第一次软件技术讲座。有上百名专业软件开发者及爱好者到场参加&#xff0c;两位主讲人熊节&#xff08;也就是我本人&#xff09;和石一楹为大家送上了关于重构思想…...

最高级网站建设/百度企业官网

albert1017Linux下压缩某个文件夹&#xff08;文件夹打包&#xff09; tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录例子&#xff1a;把/xahot文件夹打包后生成一个/home/xahot.tar.gz的文件。 # tar -xf all.tar 这条命令是解出all.t…...

为什么检测行业不能用网站做/友情链接交换平台免费

cmin和cmax介绍 cmin和cmax是PostgreSQL中表的系统字段之一&#xff0c;用来判断同一个事务内的其他命令导致的行版本变更是否可见。即在事务中每个命令都应该能看到其之前执行的命令的变更。 很多人都通过测试都会发现在同一张表中cmin和cmax总是相等的&#xff0c;所以认为…...

郑州做网站公司电话/jmr119色带

以前好多倒计时的需求都需要自己去写&#xff0c;今天发现android 原来自带了倒计时的类CountDownTimer&#xff0c;和适合用于发送短信&#xff0c;等待验证码的情况代码展示了在一个TextView进行60S的倒计时功能public class MainActivity extendsAppCompatActivity{private …...

管理公司网站建设/推广引流哪个软件最好

作为一名大数据领域的从业者&#xff0c;我来回答一下这个问题。​在大数据技术的推动下&#xff0c;随着数据价值的不断提高&#xff0c;关于个人隐私的安全问题受到了更多的关注&#xff0c;关于如何在大数据时代保护个人隐私(数据安全)也是目前不少研究生的研究课题。大数据…...

宁津诚信建设网站/宁德市房价

织梦网站漏洞层出不穷&#xff0c;织梦核心目录include是关键&#xff0c;经常被人访问&#xff0c;当反面教材拿来练手&#xff0c;所以我们要把验证码搬出include目录&#xff0c;织梦验证码搬家&#xff0c;如果网站不使用验证码的&#xff0c;可以将include文件夹改名。被别…...