如何在不造成重复的情况下查找和替换

时间:2016-06-13 18:02:32

标签: java string replace

我有一系列文字报告,其中包括 他们"Contractile Front velocity"

其中一些人对他们有"Contractile Front velocitycms"。还有其他与此类似的术语,其中添加了像cms这样的字符。

每个术语都有一个与之相关的数值结果,我试图将术语和结果放入数据库中。数据库字段将是(对于此示例)"Contractile Front velocitycms"

所以我想将没有与之关联的cms的任何报告(纯文本)字段转换为Contractile Front velocitycms

因为我有一个需要解决替换问题的负载我创建了一个使用StringUtils.replaceEach的方法,这样我就可以使用一个简单的冒号分隔文本文件作为查找字典来进行查找和替换。

public static String FindNReplace(String n) throws IOException{
    String [] split = null;
    ArrayList<String> orig = new ArrayList<String>();
    String [] orig_arr = null;
    ArrayList<String> newDoc = new ArrayList<String>();
    String [] newDoc_arr = null;

    String dictionary="/Users/sebastianzeki/Documents/workspace/PhysiologyUpperGITotalExtractorv2/src/Overview/FindNReplaceDictionary.txt";
    BufferedReader br = new BufferedReader(new FileReader(dictionary));

    try {
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();

        while (line != null) {
            split=line.split(":");
            System.out.println(split);
            orig.add(split[1]);
            newDoc.add(split[0]);
            sb.append(line);
            sb.append("\n");
            line = br.readLine();
        }
    } finally {
        br.close();
    }

    orig_arr = new String[orig.size()];
    orig_arr = orig.toArray(orig_arr);
    newDoc_arr = new String[newDoc.size()];
    newDoc_arr = newDoc.toArray(newDoc_arr);
    String replacer = StringUtils.replaceEach(n, orig_arr, newDoc_arr);

    return replacer;
}

字典看起来像这样

PostPr :Post-Prandial
PostPr :Post-prandial
Nausea :nausea

问题在于,如果我只使用我的词典将Contractile Front velocity替换为Contractile Front velocitycms,那么偶尔会出现Contractile Front velocitycms已经存在的情况下,我将获得Contractile Front velocitycmscmsreplaceEach不使用正则表达式。任何人都可以想到一个解决方案,以避免我得到重复提到的

1 个答案:

答案 0 :(得分:1)

你想要的是 Negative Lookahead 以排除尾随部分 否定预测写为(?!pattern),因此在您的情况下,您希望Contractile Front velocity(?!cms)作为匹配的模式。

您可以在RegexPlanet上尝试此... ... 我用过:
    正则表达式:收缩前速度(?!cms)
    输入1:此收缩前速度已经有了它     输入2:但此收缩前速度不会。

当你点击 Test 按钮时,你会看到输入2获得了“cms”,但输入1没有加倍。