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; //大写字母Ichar ch1 = (char) 105; //小写字母ichar ch2 = (char) 304; //这个字符与小写字母i相似,但不是小写字母iSystem.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() 方法?

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机桥接模式网络连接不上解决方法

可能是桥接模式自动配置网络地址的时候没配好,自己手动配置一下。先看看windows里的wifi的ip 把虚拟机的网络设置打开ipv4把地址、子网掩码、网关输进去,然后再连接

频繁拿下定点,华玉高性能中间件迈入商业化新阶段

伴随着智能驾驶渗透率的快速增长,中国基础软件市场开始进入黄金窗口期。 近日,华玉通软(下称“华玉”)正式获得某国内头部轨道交通产业集团的智能化中间件平台定点项目。这将是华玉在基础软件领域深耕和商业化发展过程中的又一重…

Java:188 基于springboot妇幼健康管理系统

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本妇幼健康管理系统分为管理员、用户、医生三个权限。 管理员可以管理用户、医生的基本信息内容,可以管理药物信息以及患者预约信息等操作…

使用Excel制作通达信自定义“序列数据“

序列数据的视频教程演示 Excel制作通达信自定义序列数据 1.序列数据的制作方法:删掉没有用的数据(行与列)和股代码格式处理,是和外部数据的制作方法是相同,自己上面看历史博文。只需要判断一下,股代码跟随的…

计算机网络概要与习题

第1章 概论 1、计算机网络 2、互联网 3、计算机网络体系结构 分层模型 OSI/RM 7层模型 TCP/IP 5层模型 协议、PDU、SDU、SAP等术语 数据封装(计算) 第2章 数据通信基础 1、数据通信系统组成 2、主要性能指标 数据传输速率 码元速率 时延 …

微信小程序-基于Vant Weapp UI 组件库的Area 省市区选择

Area 省市区选择,省市区选择组件通常与 弹出层 组件配合使用。 areaList 格式 areaList 为对象结构,包含 province_list、city_list、county_list 三个 key。 每项以地区码作为 key,省市区名字作为 value。地区码为 6 位数字,前两…

每天40分玩转Django:Django静态文件

Django静态文件 一、今日学习内容概述 学习模块重要程度主要内容静态文件配置⭐⭐⭐⭐⭐基础设置、路径配置CDN集成⭐⭐⭐⭐⭐CDN配置、资源优化静态文件处理⭐⭐⭐⭐压缩、版本控制部署优化⭐⭐⭐⭐性能优化、缓存策略 二、基础配置 # settings.py import os# 静态文件配置…

Python数据处理——re库与pydantic的使用总结与实战,处理采集到的思科ASA防火墙设备信息

目录 Python正则表达式re库的基本用法 引入re库 各函数功能 总结 使用方法举例 正则表达式语法与书写方式 正则表达式的常用操作符 思科ASA防火墙数据 数据1 数据2 书写正则表达式 Python中pydantic的使用 导入基础数据模板 根据数据采集目标定义Pydantic数据类型…

「Python数据科学」标量、向量、矩阵、张量与多维数组的辨析

引言 在数据科学中,有很多概念,其中,最容易搞混的就是标量、向量、矩阵、张量了。具体到这些概念的落地实现,又与多维数组有着密不可分的联系。 本文就来尝试对这些概念进行简要地梳理,从而更加清晰地理解这些概念及…

iOS开发代码块-OC版

iOS开发代码块-OC版 资源分享资源使用详情Xcode自带代码块自定义代码块 资源分享 自提: 通过网盘分享的文件:CodeSnippets 2.zip 链接: https://pan.baidu.com/s/1Yh8q9PbyeNpuYpasG4IiVg?pwddn1i 提取码: dn1i Xcode中的代码片段默认放在下面的目录中…

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项任务书正式赛题

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项任务书-A 目录 一、竞赛阶段 二、竞赛任务书内容 (一)拓扑图 (二)模块A 基础设施设置与安全加固(200分) (三)B模块安全事件响应/网络安全数据取证/…

Git(11)之log显示支持中文

Git(11)之log显示支持中文 Author:Once Day Date:2024年12月21日 漫漫长路有人对你微笑过嘛… 参考文档:GIT使用log命令显示中文乱码_gitlab的log在matlab里显示中文乱码-CSDN博客 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSD…

rabbitmq相关使用

使用rabbitmq实现异步解耦 使用步骤&#xff1a; 1、pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2、yml配置文件 spring:rabbitmq:host: 12…

oracle linux8.10+ oracle 23ai安装

介质准备&#xff1a; 数据库23ai https://edelivery.oracle.com 上述网站下载基础版本&#xff0c;本次未使用。 本次是安装了带补丁的版本&#xff1a; Database Release Update 23.6.0.24.10 GoldImage表示带补丁用于直接安装的软件包 查找888.1对应Primary Note for …

使用helm安装canal-server和canal-admin

1.前置条件&#xff1a; 需要电脑有helm kubectl 如果没有的话需要安装环境 2.需要拉取canal-server和canal-admin镜像 拉取镜像的时候可能存在拉取不下来的情况&#xff0c;需要配置&#xff1a; /etc/docker/daemon.json {"registry-mirrors": ["https://do…

使用ForceBindIP绑定应用到指定IP

前言 使用ForceBindIP工具&#xff0c;用户可以轻松地将特定应用程序绑定到指定的IP地址&#xff0c;从而确保应用程序的网络连接通过指定的网络适配器进行。通过在命令提示符下运行ForceBindIP并指定IP地址和应用程序的完整路径&#xff0c;用户能够控制应用程序的网络流量&a…

Windows下安装Rabbit MQ

一、安装环境&#xff1a; 系统&#xff1a;windows11; 环境配置安装&#xff1a;otp_win64_25.3.2.14.exe&#xff08;erlang类库&#xff09;&#xff1b; 服务应用安装&#xff1a;rabbitmq-server-3.12.4.exe&#xff1b; 二、erlang环境&#xff1a; 1.执行…

层序遍历练习

层次遍历 II 给定一个二叉树&#xff0c;返回其节点值自底向上的层次遍历。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 思路 相对于102.二叉树的层序遍历&#xff0c;就是最后把result数组反转一下就可以了。 C代码&…

[Python机器学习]:Anaconda3实践环境安装和使用

文章目录 一&#xff1a;机器学习基本环境安装二&#xff1a;设置环境变量三&#xff1a;检查结果四&#xff1a;创建自己的虚拟环境1&#xff1a;查看虚拟环境: conda env list2&#xff1a;创建新环境:conda create --name envname python3.83&#xff1a;删除环境:conda rem…

重温设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…