You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java单正则实现:替换非最后一个点及非字母数字字符为下划线

单个正则实现双需求解决方案

当然可以用单个正则表达式同时搞定这两个需求!咱们先明确要解决的问题:

  • 把除最后一个.外的所有.替换成_
  • 把所有非a-zA-Z0-9的字符(比如$、[这类)也替换成_

核心思路

利用正向否定预查来精准区分“最后一个.”和其他字符。正则会匹配两种需要替换的内容:

  1. 所有非字母数字的字符(包括.),但排除掉最后一个.
  2. 除最后一个.之外的所有.

正则表达式与代码示例

针对Java环境(你用的replaceAll是Java的方法),可以这么写:

String str = "test.e$xamp[le.test.csv";
str = str.replaceAll("(?!\\.[^.]*$)[^a-zA-Z0-9]", "_");
System.out.println(str); // 输出:test_e_xamp_le_test.csv

正则细节解释

咱们拆解一下这个正则(?!\\.[^.]*$)[^a-zA-Z0-9]:

  • (?!\\.[^.]*$):这是正向否定预查,意思是“当前位置的后面,不是以一个. + 任意非.字符 + 字符串结尾”。简单说就是:当前匹配到的.不是最后一个.
  • [^a-zA-Z0-9]:匹配所有非字母数字的字符,包括.——但只有不符合上面预查条件的.(也就是非最后一个.)才会被选中替换

这样一来,一次replaceAll就能同时完成两个替换需求,完美得到你想要的结果!

内容的提问来源于stack exchange,提问作者rajesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:59:17