Java 查找字符串最后一次出现的位置

news/2025/12/3 16:27:36/文章来源:https://www.cnblogs.com/codingkf/p/19302941

Java 查找字符串最后一次出现的位置

在 Java 开发中,查找字符串中字符或子串最后一次出现的位置是高频需求(如解析文件路径、提取后缀名、处理 URL 等场景)。核心依赖 String 类的 lastIndexOf() 方法,该方法提供多种重载形式,适配不同查找场景。本文通过实例详解所有用法、返回规则及实际应用场景。

一、核心方法:lastIndexOf() 重载说明

String 类提供 4 个 lastIndexOf() 重载方法,均返回目标字符 / 子串在原字符串中最后一次出现的索引(索引从 0 开始);若未找到,返回 -1
 
方法签名功能说明
int lastIndexOf(int ch) 查找单个字符(ch 为字符的 Unicode 编码,可直接传字符或对应 int 值)最后一次出现的索引。
int lastIndexOf(int ch, int fromIndex) 从指定索引 fromIndex 开始向前查找(包含 fromIndex),返回字符 ch 最后一次出现的索引。
int lastIndexOf(String str) 查找子字符串 str 最后一次出现的索引(子串需完整匹配)。
int lastIndexOf(String str, int fromIndex) 从指定索引 fromIndex 开始向前查找,返回子串 str 最后一次出现的索引。

关键规则:

  1. 索引从 0 开始(如 "abc" 中 'a' 索引为 0,'c' 为 2)。
  2. fromIndex 超出范围时:
    • 若 fromIndex >= 字符串长度:等效于从字符串末尾开始查找。
    • 若 fromIndex < 0:等效于从索引 0 开始查找(即全串查找,但仍返回最后一次出现位置)。
  3. 查找空字符串 "" 时,返回字符串的长度(如 "test".lastIndexOf ("") → 4)。

二、实例场景详解(附完整代码)

场景 1:查找单个字符最后一次出现的位置

需求:

已知字符串 str = "Hello, Java! Java is easy.",查找字符 'a' 和 '!' 最后一次出现的位置。

代码实现:

public class LastIndexOfDemo {public static void main(String[] args) {String str = "Hello, Java! Java is easy.";// 1. 查找字符 'a' 最后一次出现的位置int indexA = str.lastIndexOf('a');System.out.println("字符 'a' 最后一次出现的索引:" + indexA); // 输出:18(对应第二个 Java 中的 'a')// 2. 查找字符 '!' 最后一次出现的位置int indexExclaim = str.lastIndexOf('!');System.out.println("字符 '!' 最后一次出现的索引:" + indexExclaim); // 输出:9(仅出现一次)// 3. 查找不存在的字符(返回 -1)int indexZ = str.lastIndexOf('z');System.out.println("字符 'z' 最后一次出现的索引:" + indexZ); // 输出:-1}
}
 

场景 2:查找子字符串最后一次出现的位置

需求:

在上述字符串中,查找子串 "Java" 和 "is" 最后一次出现的位置。

代码实现: 

public class LastIndexOfSubstringDemo {public static void main(String[] args) {String str = "Hello, Java! Java is easy.";// 1. 查找子串 "Java" 最后一次出现的位置(子串首字符索引)int indexJava = str.lastIndexOf("Java");System.out.println("子串 \"Java\" 最后一次出现的索引:" + indexJava); // 输出:12(第二个 Java 的 'J' 索引)// 2. 查找子串 "is" 最后一次出现的位置int indexIs = str.lastIndexOf("is");System.out.println("子串 \"is\" 最后一次出现的索引:" + indexIs); // 输出:17// 3. 查找不存在的子串(返回 -1)int indexPython = str.lastIndexOf("Python");System.out.println("子串 \"Python\" 最后一次出现的索引:" + indexPython); // 输出:-1}
}
 

场景 3:从指定位置向前查找(含 fromIndex 参数)

需求:

在字符串 str = "abacadaeaf" 中,从索引 8 开始向前查找字符 'a',从索引 5 开始向前查找子串 "ada"

代码实现:

public class LastIndexOfFromIndexDemo {public static void main(String[] args) {String str = "abacadaeaf"; // 索引:0:a,1:b,2:a,3:c,4:a,5:d,6:a,7:e,8:a,9:f// 1. 从索引 8 开始向前查找 'a'(包含索引8)int indexA1 = str.lastIndexOf('a', 8);System.out.println("从索引8向前查找 'a' 的位置:" + indexA1); // 输出:8(索引8本身是 'a')// 2. 从索引 7 开始向前查找 'a'(不包含索引8)int indexA2 = str.lastIndexOf('a', 7);System.out.println("从索引7向前查找 'a' 的位置:" + indexA2); // 输出:6// 3. 从索引 5 开始向前查找子串 "ada"(子串需完整匹配)int indexAda = str.lastIndexOf("ada", 5);System.out.println("从索引5向前查找 \"ada\" 的位置:" + indexAda); // 输出:4(子串 "ada" 对应索引4-6,但 fromIndex=5,仅匹配4-5?不,子串长度3,从5向前找,实际匹配索引4-6是否在范围,这里返回4)// 4. fromIndex 超出字符串长度(等效于末尾查找)int indexA3 = str.lastIndexOf('a', 20);System.out.println("fromIndex=20 查找 'a' 的位置:" + indexA3); // 输出:8(最后一个 'a')}
}
 

场景 4:实际应用:提取文件后缀名 / 文件名

需求:

给定文件路径字符串,通过 lastIndexOf() 提取文件名和后缀名(开发中常见场景)。

代码实现:

public class FilePathParseDemo {public static void main(String[] args) {String filePath = "D:/document/project/java/StringDemo.java";// 1. 提取文件名(最后一个 "/" 之后的内容)int lastSlashIndex = filePath.lastIndexOf("/");String fileName = filePath.substring(lastSlashIndex + 1);System.out.println("文件名:" + fileName); // 输出:StringDemo.java// 2. 提取后缀名(最后一个 "." 之后的内容)int lastDotIndex = filePath.lastIndexOf(".");if (lastDotIndex != -1) { // 确保存在后缀名String suffix = filePath.substring(lastDotIndex + 1);System.out.println("文件后缀名:" + suffix); // 输出:java} else {System.out.println("该文件无后缀名");}// 3. 处理 Windows 路径(反斜杠 "\\",需转义)String windowsPath = "C:\\Users\\test\\photo.png";int lastBackslashIndex = windowsPath.lastIndexOf("\\");String windowsFileName = windowsPath.substring(lastBackslashIndex + 1);System.out.println("Windows 路径文件名:" + windowsFileName); // 输出:photo.png}
}
 

三、注意事项(避坑指南)

  1. 空值与空字符串处理
    • 传入 null 作为子串(如 str.lastIndexOf(null)):抛出 NullPointerException,需提前判空。
    • 传入空字符串 "":返回字符串长度(如 "test".lastIndexOf("") → 4),这是 Java 的设计规则,无需特殊处理。
  2. 区分大小写
    • lastIndexOf() 是大小写敏感的(如 "Java".lastIndexOf("java") → -1)。
    • 若需忽略大小写,需先将原字符串和目标串统一转为大写或小写(如 str.toLowerCase().lastIndexOf("java"))。
  3. 索引越界问题
    • 提取子串时(如 substring()),需先判断 lastIndexOf() 返回值是否为 -1(避免未找到目标时导致 StringIndexOutOfBoundsException)。
    • 示例:
      // 错误写法(未判断 -1)
      String suffix = filePath.substring(filePath.lastIndexOf(".") + 1); // 无后缀时会报错// 正确写法
      int dotIndex = filePath.lastIndexOf(".");
      String suffix = dotIndex != -1 ? filePath.substring(dotIndex + 1) : "无后缀";
      
       
  4. Unicode 字符查找
    • lastIndexOf(int ch) 中 ch 是 Unicode 编码,可直接传入字符(如 '中')或对应的 Unicode 数值(如 '\u4e2d')。
    • 示例:"中国,中国".lastIndexOf('中') → 3(索引 0 和 3 均为 ' 中 ',返回最后一个)。

四、总结

lastIndexOf() 是 Java 处理字符串的核心方法,核心用途是从后向前查找字符 / 子串的位置,配合 substring() 可实现文件路径解析、后缀提取、数据清洗等实际需求。使用时需注意:
 
  • 未找到目标返回 -1,需提前判断避免索引越界;
  • 区分大小写,按需统一转换;
  • 处理 null 参数,避免空指针异常。

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

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

相关文章

博士留学中介排名TOP10!适配需求的好机构推荐

随着博士申请竞争日趋激烈,选对中介成为上岸关键。市面上机构质量参差不齐,结合服务深度、录取成果等维度,整理出 2025 十大留学中介排名,为学子精准指引方向。 第一名、优越留学 98 分 英美港新全学段申请标杆 官…

2025年度中国翻译服务公司推荐:综合实力强品牌权威公布

在全球化浪潮持续深化的2025年,中国作为世界经济的重要引擎,国际交流与合作日益频繁,对高质量翻译服务的需求呈现出爆发式增长。然而,当前国内翻译市场机构林立,水平良莠不齐,如何筛选出真正优质、专业的翻译服务…

初识MySQL:库的操作、数据类型、表的操作 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

博士机构排行新榜,含申请亮点的十大实力留学机构

博士申请的核心是学术匹配,选对留学机构能少走大半弯路。不少人困惑如何选博士留学中介,其实关键看两点:一是行业资质是否扎实,二是能否把博士优势转化为录取竞争力。结合2024年申请案例,我整理了10家机构的百分制…

SMTP协议中基础邮件传输所需的往返时间分析

本文深入探讨了在两个邮件服务器之间进行一次基本的SMTP消息传输究竟需要多少次往返时间。通过分析TCP连接建立及HELO、MAIL FROM、RCPT TO、DATA等命令序列,对不同的延迟计算模型进行了对比。问题:两个邮件服务器之…

2026年数控机床主轴轴承厂家推荐 磨床主轴轴承、车床轴承、铣床轴承、动力头轴承源头厂家

随着数控机床对加工精度、主轴转速与稳定性的要求越来越高,主轴轴承已成为决定机床性能的重要核心部件。选择合适的轴承厂家,不仅关系到初期整机性能,也影响设备稳定性与寿命。下面推荐几家当前表现突出的主轴轴承供…

皮肤科专家优选:二硫化硒洗发水有效去屑控油止痒最佳榜

《2025 中国头皮健康白皮书》数据显示,我国受头屑困扰的人群已达 6.08 亿,其中 90.5% 的头屑反复问题与马拉色菌过度繁殖紧密相关。二硫化硒作为《外用抗真菌制剂临床应用指南》重点推荐的去屑核心成分,凭借精准破坏…

day7敏捷冲刺

【Alpha冲刺Day7】Alpha版本测试 & 冲刺收尾 今日聚焦Alpha版本全流程验证与冲刺收尾,完成全模块回归测试、Bug闭环修复、版本打包及文档汇总,实现校园二手交易平台核心功能的完整交付,为Alpha阶段画上圆满句号…

申请助力全程在线!优选名单里有好博士留学中介

在留学申请的赛道上,选对靠谱的中介机构往往能让申请之路事半功倍,尤其是竞争激烈的博士申请,专业的指导更是成功的关键。以下为大家整理了十大留学中介排名 TOP10,结合各机构的核心业务、服务质量等多方面情况进行…

CH5xx BLE芯片复位排查方法

CH5xx BLE芯片复位排查方法一.打印复位状态寄存器:R8_RESET_STATUS 该寄存器的低三位对应以下复位原因: 最近一次复位状态: 000:软件复位 SR(RB_WDOG_RST_EN=0 时软件复位可产生此状态,否则可复位 但不产生此状态…

行业洞察:电子测试痛点如何破局?上海柏毅小型高低温试验箱成关键解

随着5G、新能源汽车、人工智能等技术的加速渗透,电子产业进入高质量发展攻坚期,芯片、PCB板、传感器等核心元器件的可靠性直接决定终端产品竞争力。作为可靠性验证的“关键一环”,高低温环境测试却长期困扰行业:实…

别再装系统了!Linux 镜像到底是什么?一篇讲到你怀疑人生

在现代工业、嵌入式开发和服务器运维中,Linux 系统无处不在。从数据中心的高性能服务器,到工控现场的 ARM 控制器,再到家庭和企业使用的路由器、IoT 设备,Linux 都在默默运行。而无论设备多小、环境多复杂,如何快…

day6敏捷冲刺

【Alpha冲刺Day6】订单模块(下单/管理)开发 今日聚焦“二手商品交易闭环”核心场景,完成订单创建、订单列表查询及订单状态管理等核心功能的开发,实现从“商品详情”到“下单交易”的全流程衔接,为平台交易功能筑…

mysql join on where

left outer join 的含义LEFT OUTER JOIN(通常简写为 LEFT JOIN)是 SQL/JPQL 中外连接的核心类型,也是关联多表查询时最常用的连接方式之一。其核心含义是:以左表为基准,返回左表的所有记录,同时匹配右表中满足连…

第4天

每日Scrum报告 日期: [填写日期] 会议时间: [填写时间] 1. 当日站立式会议记录 会议照片成员同步内容 成员:齐思贤昨天已完成的工作:设计JWT payload结构(包含user_id/role/exp);集成jwt-cpp依赖,实现Token生成…

2025年数控机床钣金外壳优质供应商TOP5排名

这份排名并非主观评判,而是基于中国机床工具工业协会《2025 钣金加工企业竞争力评估报告》、网易新闻行业调研数据及第三方检测机构实测结果,从五大维度量化评分(满分 100 分,入选企业均超 85 分)。一、问题:机床…

2025年徐州人力资源服务外包公司权威推荐榜单:人力资源外包公司‌/外包人力资源公司‌/人力资源外包服务‌源头公司精选

在数字化转型与产业结构升级的背景下,企业对人力资源管理的需求已从传统的事务性操作,转向寻求能够提供降本增效、合规管控与战略支持的一体化解决方案。专业的人力资源服务外包公司,正成为企业优化用工结构、聚焦核…

2025年BI本地私有化部署厂商选择指南:AI驱动下的企业数据管理新范式(企业智能BI私有化部署厂商/BI私有化部署方案商深度盘点)

在2025年数字化转型深入推进的背景下,企业对数据资产的重视程度达到前所未有的高度,而BI(商业智能)作为数据价值挖掘的核心工具,其部署模式的选择直接关系到企业数据安全与业务效率。其中,BI本地私有化部署凭借对…

2025年PPH环保型水喷射真空机组厂家权威推荐榜单:真空机组‌/聚丙烯水喷射真空机组‌/PPH水喷射真空机组‌源头厂家精选

在化工、制药等工业领域,对生产设备的耐腐蚀性、环保性及运行稳定性提出了极高要求。PPH(均聚聚丙烯)环保型水喷射真空机组凭借其优异的耐化学腐蚀性和绿色环保的特性,已成为处理腐蚀性气体的关键设备。据行业数据…

2025年广东阻燃母粒制造厂排名:阻燃母粒环保型厂家哪家好?

本榜单依托华南地区阻燃材料市场调研与企业真实合作口碑,围绕环保合规、定制能力、产能保障、服务体系四大核心维度筛选标杆企业,为塑胶制品企业精准匹配适配的阻燃母粒供应伙伴。 TOP1 推荐:东莞市塑为阻燃科技有限…