如何提取String2中不属于String1的内容并将其调整为与String1一致?
解决方案
有没有现成工具类?
没有完全贴合你需求的通用工具类,但可以借助文本差异对比库简化实现,比如Google的DiffMatchPatch。它能生成两个字符串的差异块,你可基于这些块过滤掉string2独有的内容,同时收集移除的片段。
实现思路与代码示例
1. 用DiffMatchPatch实现
引入该库后,可通过差异块筛选实现需求:
import com.google.diffmatchpatch.DiffMatchPatch; import java.util.ArrayList; import java.util.List; public class StringAdjuster { public static void main(String[] args) { String string1 = "this is my string "; String string2 = "this is not my string that I want"; DiffMatchPatch dmp = new DiffMatchPatch(); List<DiffMatchPatch.Diff> diffs = dmp.diffMain(string1, string2); List<String> removedParts = new ArrayList<>(); StringBuilder adjustedString2 = new StringBuilder(); // 遍历差异块,保留匹配内容,收集string2独有的插入内容 for (DiffMatchPatch.Diff diff : diffs) { if (diff.operation == DiffMatchPatch.Operation.EQUAL) { adjustedString2.append(diff.text); } else if (diff.operation == DiffMatchPatch.Operation.INSERT) { String trimmed = diff.text.trim(); if (!trimmed.isEmpty()) { removedParts.add(trimmed); } } } System.out.println("调整后的string2: " + adjustedString2); System.out.println("移除的内容: " + removedParts); } }
运行结果:
调整后的string2: this is my string 移除的内容: [not, that I want]
2. 自行实现(灵活定制)
如果不想引入第三方库,可通过分割字符串+双指针的方式实现,还能精准保留原格式:
import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; public class StringAdjuster { // 正则分割,保留单词和空格的独立片段 private static final Pattern SPLIT_PATTERN = Pattern.compile("(\\s+|\\S+)"); public static void main(String[] args) { String string1 = "this is my string "; String string2 = "this is not my string that I want"; List<String> parts1 = splitWithWhitespace(string1); List<String> parts2 = splitWithWhitespace(string2); List<String> removedParts = new ArrayList<>(); StringBuilder adjustedString2 = new StringBuilder(); int i = 0, j = 0; while (i < parts1.size() && j < parts2.size()) { String p1 = parts1.get(i); String p2 = parts2.get(j); if (p1.equals(p2)) { adjustedString2.append(p1); i++; j++; } else { String trimmed = p2.trim(); if (!trimmed.isEmpty()) { removedParts.add(trimmed); } j++; } } // 处理string2剩余的未匹配内容 while (j < parts2.size()) { String trimmed = parts2.get(j).trim(); if (!trimmed.isEmpty()) { removedParts.add(trimmed); } j++; } System.out.println("调整后的string2: " + adjustedString2); System.out.println("移除的内容: " + removedParts); } private static List<String> splitWithWhitespace(String str) { List<String> parts = new ArrayList<>(); var matcher = SPLIT_PATTERN.matcher(str); while (matcher.find()) { parts.add(matcher.group()); } return parts; } }
运行结果与上述一致,且能严格保留原字符串的空格格式。
总结
- 追求快速实现:用
DiffMatchPatch这类差异库最省心; - 需要定制规则(如特殊格式处理):自行实现双指针或分割遍历的方式更灵活。
内容的提问来源于stack exchange,提问作者Serhii Kachan
相关产品推荐
相关产品推荐

