Java单正则实现:替换非最后一个点及非字母数字字符为下划线
单个正则实现双需求解决方案
当然可以用单个正则表达式同时搞定这两个需求!咱们先明确要解决的问题:
- 把除最后一个
.外的所有.替换成_ - 把所有非
a-zA-Z0-9的字符(比如$、[这类)也替换成_
核心思路
利用正向否定预查来精准区分“最后一个.”和其他字符。正则会匹配两种需要替换的内容:
- 所有非字母数字的字符(包括
.),但排除掉最后一个. - 除最后一个
.之外的所有.
正则表达式与代码示例
针对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
相关产品推荐
相关产品推荐

