Java中以某字符串开头且忽略大小写字母如何实现【正则表达式(Regex)】

在这里插入图片描述

第一种思路是先将它们都转换为小写或大写,再使用String类的startsWith()方法实现:
例如,如下的二个示例:

 		"Session".toLowerCase().startsWith("sEsSi".toLowerCase()); //例子之一
		//例子之二
		String str = "Hello World";
		String prefix = "hello";
		if (str.toLowerCase().startsWith(prefix.toLowerCase())) {
		    System.out.println("字符串以指定前缀开头,忽略大小写,匹配成功。");
		} else {
		    System.out.println("字符串以指定前缀开头,忽略大小写,匹配不成功。");
		}

尽管上面的代码看上去没有问题,运行结果也符合预期。但是实际上是 有瑕疵(BUG) 的。
根据Unicode技术标准:由于自然语言的变幻莫测,有时两个不同的Unicode字符具有相同的大写或小写。因此,仅比较两个字符的大写字母是不够的,因为它们可能有不同的大写字母和相同的小写字母;反之,仅比较小写字母,可能也存在类似问题。
我们来看一个反例来证明这个论点:

	public static void main(String[] args) {
		/***
		String str = "Hello World";
		String prefix = "hello";

		if (str.toLowerCase().startsWith(prefix.toLowerCase())) {
		    System.out.println("字符串以指定前缀开头,忽略大小写,匹配成功。");
		} else {
		    System.out.println("字符串以指定前缀开头,忽略大小写,匹配不成功。");
		}
		***/

		/***来自Unicode技术标准:此外,由于自然语言的变幻莫测,有时两个不同的Unicode字符具有相同的大写或小写。
		 * 因此,仅比较两个字符的大写字母是不够的,因为它们可能有不同的大写字母和相同的小写字母***/
		char ch0 = (char) 73; //大写字母I
		char ch1 = (char) 105; //小写字母i
		char ch2 = (char) 304; //这个字符与小写字母i相似,但不是小写字母i
		
		System.out.println(ch1==ch2);
		System.out.println(Character.toUpperCase(ch1)==Character.toUpperCase(ch2));
		System.out.println(Character.toLowerCase(ch1)==Character.toLowerCase(ch2));
		
		System.out.println("I的大写:"+Character.toUpperCase(ch0));
		System.out.println("i的大写:"+Character.toUpperCase(ch1));
		System.out.println("(char) 304的大写:"+Character.toUpperCase(ch2));
		System.out.println("I的小写:"+Character.toLowerCase(ch0));
		System.out.println("i的小写:"+Character.toLowerCase(ch1));
		System.out.println("(char) 304的小写:"+Character.toLowerCase(ch2));
	}

程序的测试结果是:字符【(char) 304】的小写是字母’i’,但其大写不是字母’I’。字符【(char) 304】的大字字母就是其本身(转换为整型数显示为304)。
程序运行测试结果如下:
在这里插入图片描述
原因说明: 由于格鲁吉亚字母表有奇怪的大小写转换规则。当文本信息中同时包含拉丁字母和格鲁吉亚字母时,转换为大写或小写比较时可能会出现错误结果。
先将它们都转换为小写或大写,再使用String类的startsWith()方法实现的方案,通常情况下是没有问题的;但当多种字母表在同一文本中时,使用这种方案比较有可能得到错误的结果。例如:示例中字符【(char) 304】的小写是字母’i’,但其大写不是字母’I’。当转换为小写进行比较时,它的小写字母会与拉丁字母的小写字母’i’匹配成功。

第二种选择是使用 String类的regionMatches() 方法,该方法采用布尔(boolean)型参数 ignoreCase,指定是否进行区分大小写的匹配。
String类测试两个字符串区域是否相等的regionMatches() 方法,它有两个重载形式:

	/***两个重载形式***/
	public boolean regionMatches(int toffset, String other, int ooffset, int len)
	public boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)

请看一个使用示例:
第一个参数是 true ,表示它将进行不区分大小写的匹配。

	public static void strRegionMatches() {
		String str = "Session";
		String prefix = "sEsSi";
		boolean reslut = str.regionMatches(true, 0, prefix, 0, prefix.length());
		System.out.println("比较结果:"+reslut);  //打印结果: 比较结果:true
	}

第三种方案: 使用正则表达式进行比较来实现“以某字符串开头且忽略大小写字母”

除了使用String类的startsWith()方法外,我们还可以使用正则表达式进行字符串比较。正则表达式是一种强大的模式匹配工具,可以用于字符串的匹配、替换和提取。

在Java中,我们可以使用Pattern和Matcher类来使用正则表达式进行字符串比较。下面的代码示例演示了如何使用正则表达式判断一个字符串是否以指定前缀开头,忽略大小写:

	public static void strComparatorByRegex() {
		String str = "Hello Java";
		String prefix = "heLlo";

		Pattern pattern = Pattern.compile("^" + prefix, Pattern.CASE_INSENSITIVE);
		Matcher matcher = pattern.matcher(str);

		if (matcher.find()) {
		    System.out.println("字符串以指定前缀开头,忽略大小写,匹配成功。");
		} else {
		    System.out.println("字符串以指定前缀开头,忽略大小写,匹配不成功。");
		}
		/***以某字符串开头且忽略大小写字母,使用String类的startsWith()方法***
		if (str.toLowerCase().startsWith(prefix.toLowerCase())) {
		    System.out.println("字符串以指定前缀开头,忽略大小写,匹配成功。");
		} else {
		    System.out.println("字符串以指定前缀开头,忽略大小写,匹配不成功。");
		}
		***/
	}

上述代码中,我们首先使用Pattern.compile()方法创建一个正则表达式,其中 “^” 表示匹配字符串的开头,Pattern.CASE_INSENSITIVE表示忽略大小写。然后使用Matcher类的find()方法进行匹配,如果匹配成功,则表示字符串以指定前缀开头,忽略大小写。

**第四种方案:**使用String类的matches()方法,参数中应用正则表达式

最后,再来看一个非常简明的示例。
如何使用正则表达式(Regex)判断一个字符串是否以指定前缀开头,忽略大小写。
作为一个正则表达式(Regex)铁杆技术迷,可以这样来实现这个功能。(?i) 嵌入标志用于忽略大小写匹配。

		String str = "Hello Java";
		String prefix = "heLlo";
		
		System.out.println("----使用简洁的正则表达式进行比较----");
		System.out.println("----比较匹配结果:");
		System.out.println( str.matches("(?i)" + Pattern.quote(prefix) + ".*"));

说明: Pattern.quote()方法的主要作用是将给定的字符串转换为正则表达式的文字模式,防止特殊字符引起意外匹配‌。
其中Pattern.quote()方法用于将字符串regex中可能作为正则表达式的特殊字符进行转义,以确保它被视为普通文本。(?i) 这是一种嵌入的标志表达式,用于启用不区分大小写的匹配。它是正则表达式的一部分,表示不区分字母大小写(忽略字母大小写)的匹配。

	System.out.println(str.matches("(?i)" + Pattern.quote(regex) + ".*")); 

**第五种方案:**使用String类的contains()方法

如果你想要检查str是否包含子字符串other,你应该使用contains方法,而不是正则表达式匹配。代码如下:

	boolean result = str.toLowerCase(Locale.ROOT).contains(other.toLowerCase(Locale.ROOT));
	System.out.println(result);

这段代码首先将str和other转换为小写,然后使用contains方法检查other是否为str的子串。所示代码是不区分大小写的版本,如果你需要区分大小写的匹配,可以去掉toLowerCase(Locale.ROOT)调用。

参考文献:
java以某字符串开头且忽略大小写字母
如何使用忽略大小写的 string.startsWith() 方法?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/944915.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WPF 绘制过顶点的圆滑曲线 (样条,贝塞尔)

在一个WPF项目中要用到样条曲线,必须过顶点,圆滑后还不能太走样,捣鼓一番,发现里面颇有玄机,于是把我多方抄来改造的方法发出来,方便新手: 如上图,看代码吧: ----------…

SpringCloudAlibaba实战入门之路由网关Gateway断言(十二)

上一节课中我们初步讲解了网关的基本概念、基本功能,并且带大家实战体验了一下网关的初步效果,这节课我们继续学习关于网关的一些更高级有用功能,比如本篇文章的断言。 一、网关主要组成部分 上图中是核心的流程图,最主要的就是Route、Predicates 和 Filters 作用于特定路…

【Linux进程】进程信号(信号的保存与处理)

目录 前言 1. 信号的默认行为 2. 信号的保存 信号集操作函数 sigprocmask sigpending 3. 信号的处理 信号的处理过程 思考 4. sigaction 5. SIGCHLD信号 6. 可重入函数 7. volatile 总结 前言 上文介绍了信号,以及信号的产生,本文继续来聊一…

论文阅读 - 《Large Language Models Are Zero-Shot Time Series Forecasters》

Abstract 通过将时间序列编码为数字组成的字符串,我们可以将时间序列预测当做文本中下一个 token预测的框架。通过开发这种方法,我们发现像GPT-3和LLaMA-2这样的大语言模型在下游任务上可以有零样本时间序列外推能力上持平或者超过专门设计的时间序列训…

Llama系列关键知识总结

系列文章目录 第一章:LoRA微调系列笔记 第二章:Llama系列关键知识总结 文章目录 系列文章目录Llama: Open and Efficient Foundation Language Models关键要点LLaMa模型架构:Llama2分组查询注意力 (GQA) Llama3关键信息 引用: Ll…

项目实践-贪吃蛇小游戏

目录 声明 1、前言 2、实现目标 3、技术要点 4、Win32API介绍 4.1、Win32API 4.2、控制台程序 4.3、控制台屏幕上的坐标COORD 4.4、GetStdHandle 4.5、GetConsoleCursorInfo 4.6、SetConsoleCursorInfo 4.7、SetConsoleCursorPosition 4.8、GetAsyncKeyState 5、…

Java编程题_面向对象和常用API01_B级

Java编程题_面向对象和常用API01_B级 第1题 面向对象、异常、集合、IO 题干: 请编写程序,完成键盘录入学生信息,并计算总分将学生信息与总分一同写入文本文件 需求:键盘录入3个学生信息(姓名,语文成绩,数学成绩) 求出每个学生的总分 ,并…

Jmeter自学【8】- 使用JMeter模拟设备通过MQTT发送数据

今天使用jmeter推送数据到MQTT,给大家分享一下操作流程。 一、安装JMeter 参考文档:Jmeter自学【1】- Jmeter安装、配置 二、安装MQTT插件 1、下载插件 我的Jmeter版本是5.6.3,用到的插件是:mqtt-xmeter-2.0.2-jar-with-depe…

Uniapp跨域请求

1.什么是跨域 是指当一个请求的URL的协议、域名或端口与当前页面的URL不同时,该请求被视为跨域请求。跨域是一种安全策略,用于限制一个域的网页如何与另一个域的资源进行交互。就比如我们进行前端向后端进行发送请求的时候,如果是开发前后端…

基于Resnet、LSTM、Shufflenet及CNN网络的Daily_and_Sports_Activities数据集仿真

在深度学习领域,不同的网络结构设计用于解决特定的问题。本文将详细分析四种主流网络结构:卷积神经网络(CNN)、残差网络(ResNet)、长短期记忆网络(LSTM)和洗牌网络(Shuff…

算法进阶:贪心算法

贪心算法是一种简单而直观的算法思想,它在每一步选择中都采取在当前状态下最优的选择,以期望最终得到全局最优解。贪心算法通常适用于一些具有最优子结构的问题,即问题的最优解可以通过一系列局部最优解的选择得到。 贪心算法的基本思路是&a…

139.《python中的正则详解》

文章目录 什么是正则正则表达式语法正则demo1.匹配模式2.finditer3.正则分组4.非捕获组5.分组的引用6. 正则替换7.正则切割7.正则「或」7.枚举取反 面试题 前言: 拉开差距的不是上班的8小时,而是下班后的16小时,同志们,加油,卷起!!! 什么是正则 1.正则表达式是一种高级文本处理…

从安全角度看 SEH 和 VEH

从安全角度看 SEH 和 VEH 异常处理程序是处理程序中不可预见的错误的基本方法之一 https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/exceptions/ SEH——结构化异常处理程序 就其工作方式而言,异常处理程序与其他处理程序相比相当基础&#xff0…

ESP-IDF学习记录(3)ESP-IDF组件管理

既然官方把这个组件管理按钮放置的这么明显,就一定有他的用心良苦,今天学习一下这个组件管理。 Componments manager 1.给当前项目安装组件 IDF Component Manager and ESP Component Registry Documentation — IDF Component Management documenta…

华为麦芒5(安卓6)termux记录 使用ddns-go,alist

下载0.119bate1 安卓5和6版本,不能换源,其他源似乎都用不了,如果root可以直接用面具模块 https://github.com/termux/termux-app/releases/download/v0.119.0-beta.1/termux-app_v0.119.0-beta.1apt-android-5-github-debug_arm64-v8a.apk 安装ssh(非必要) pkg install open…

园区网综合拓扑实验

一、实验要求 实验拓扑图如上图所示 1、按照图示的VLAN及IP地址需求,完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan(本实验未使用) 4、上层…

JSON 系列之4:JSON_VALUE

JSON_VALUE的作用,简单来说,就是从JSON到SQL: SQL/JSON function JSON_VALUE selects JSON data and returns a SQL scalar or an instance of a user-defined SQL object type or SQL collection type (varray, nested table) 所以&#xff…

设置首选网络类型以及调用Android框架层的隐藏API

在Android SDK中提供的framework.jar是阉割版本的,比如有些类标记为hide,这些类不会被打包到这个jar中,而有些只是类中的某个方法或或属性被标记为hide,则这些类或属性会被打包到framework.jar,但是我们无法调用&#…

Mac 12.1安装tiger-vnc问题-routines:CRYPTO_internal:bad key length

背景:因为某些原因需要从本地mac连接远程linxu桌面查看一些内容,必须使用桌面查看,所以ssh无法满足,所以决定安装vnc客户端。 问题: 在mac上通过 brew install tiger-vnc命令安装, 但是报错如下: > D…

【Java-tesseract】OCR图片文本识别

文章目录 一、需求二、概述三、部署安装四、技术细节五、总结 一、需求 场景需求:是对识别常见的PNG,JPEG,TIFF,GIF图片识别,环境为离线内网。组件要求开源免费,并且可以集成Java生成接口服务。 二、概述 我不做选型对比了,我筛选测试了下Tesseract(v…