Java正则替换需求:单个\替换为",保留/\组合中的\
解决Java正则替换的两种场景需求
要实现你描述的替换逻辑,我们可以分两步处理(或者用更灵活的Matcher API做一次处理),核心是利用正则的正向预查和负向预查来区分两种不同的场景:
方案一:两次replaceAll调用(简单直观)
先处理/\组合的情况,再处理单独的\,注意顺序不能颠倒:
String result = input // 匹配后面紧跟反斜杠的正斜杠,将其替换为空(保留反斜杠) .replaceAll("/(?=\\\\)", "") // 匹配所有未被前面正斜杠关联的单独反斜杠,替换为双引号 .replaceAll("\\\\", "\"");
验证你的示例:
仅含单个反斜杠的输入:
输入:Functions.split(input.env.companyId,"\\\\")(注:Java字符串里\需转义为\\,实际内容是"\")
第一步replaceAll无匹配,第二步把\替换为",得到预期输出:Functions.split(input.env.companyId,"\"")含
/\组合的输入:
输入:Functions.split(input.env.companyId,"/\\\\")(实际内容是"/\")
第一步匹配到/(因为后面跟着\),替换为空,得到Functions.split(input.env.companyId,"\\\\");第二步没有单独的\需要替换,最终得到预期输出:Functions.split(input.env.companyId,"\\")
方案二:用Matcher API做单次条件替换(更高效)
如果不想做两次替换,可以用Matcher的appendReplacement方法,根据匹配的内容动态决定替换值:
Pattern pattern = Pattern.compile("/(?=\\\\)|(?<!/)\\\\"); Matcher matcher = pattern.matcher(input); StringBuffer sb = new StringBuffer(); while (matcher.find()) { String match = matcher.group(); if (match.equals("/")) { // 匹配到的是后面跟反斜杠的正斜杠,替换为空 matcher.appendReplacement(sb, ""); } else { // 匹配到的是单独的反斜杠,替换为双引号 matcher.appendReplacement(sb, "\""); } } matcher.appendTail(sb); String result = sb.toString();
正则表达式解释:
/(?=\\\\):匹配后面紧跟\的/,(?=\\\\)是正向预查,确保/后面是\,但不会把\包含在匹配结果里(?<!/)\\\\:匹配前面没有/的\,(?<!/)是负向预查,确保\前面不是/
这样就能精准区分两种场景,一次遍历完成替换。
内容的提问来源于stack exchange,提问作者ashok
相关产品推荐
相关产品推荐

