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

如何提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:40:25