2016-06-13 44 views
2

與領域取代我有一系列的文字報道一樣 "Contractile Front velocity"他們如何找到而不會造成重複

他們中有些人對他們"Contractile Front velocitycms"代替。還有其他一些與此類似的術語,其中像cms這樣的字符已被添加。

每個術語都有一個與之相關的數值結果,我試圖把術語和結果放到數據庫中。數據庫中的字段將(在這個例子中)"Contractile Front velocitycms"

所以我想任何報告(純文本)字段轉換是有與之相關,以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 velocitycms然後偶爾,在收縮陣線velocitycms已經存在,我會得到Contractile Front velocitycmscmsreplaceEach更換Contractile Front velocity不使用正則表達式。任何人都可以想到一個解決方案,以避免我得到重複提到

回答

1

你想要的是Negative Lookahead排除尾部。
Negative lookahead被寫爲(?!pattern)所以在你的情況下,你需要Contractile Front velocity(?!cms)作爲你的模式匹配。

你可以試試這個在RegexPlanet ...
我用:
正則表達式:收縮陣線速度
輸入1(CMS?!):該收縮陣線velocitycms已經擁有它。
輸入2:但這種收縮前速度不。

你會看到當你點擊測試按鈕,輸入2獲得「cms」添加到它,但輸入1沒有得到它加倍。