2013-03-29 52 views
1

我創建了一個簡單的測驗程序,我試圖找出一種方法來使用正則表達式返回3種類型的答案。 3個答案要麼是完全正確的,正確的(但是拼寫錯誤)並且部分正確,但仍然是正確的。使用正則表達式來分析Java中的字符串

因此,舉例來說,與字符串「大象」相比,三個字符串將是正確的:1.「大象」,2.「Elephents」,3.「大象」。

第一個字符串是完全正確的,所以會返回「正確答案」。

第二個字符串是正確的,但是拼寫錯誤('a'而不是'e'),所以會返回「正確拼寫大象」。

第三根弦是部分正確的(無「S」末),但將返回「的答案接受」

任何人都可以找出三種類型的正則表達式表達我可以用這個方法的?

非常感謝。

+2

正則表達式不適合您的工作。你可能應該使用[Levenshtein distance](http://en.wikipedia.org/wiki/Levenshtein_distance) – jlordo

+0

看看[levenstein distance](http://en.wikipedia.org/wiki/Levenshtein_distance)。 Apache公共庫StringUtils類有一個實現 – Bohemian

+0

感謝您的回覆,是的,我會研究該算法 –

回答

0

這裏沒有正則表達式的解決方案,但是你可以實現一個「距離算法」來測量兩個單詞的相對相似度。一個非常常見的算法是Levenshtein Distance或編輯距離:它會告訴您從用戶輸入的答案到正確拼寫的答案所需的「編輯操作」數量。替換,插入或刪除符號被視爲一個操作。如果距離等於或小於2,用戶輸入的答案可能只是拼寫錯誤;如果距離是三個或更多,那麼要麼是拼寫錯誤的答案,要麼是不正確的答案(兩者都應被視爲不正確)。

上面鏈接的維基百科文章具有該算法的僞代碼實現。

+0

感謝您的答覆。比較String之間的長度是更理想的解決方案,而不是正則表達式的。我將研究該算法。再次感謝 –

0

匹配的第一個正則表達式:大象 如果它不符合第二個嘗試Eleph [ae] nt。 如果還沒有,請嘗試Elephant。

您可以另外將它與詞結束標記組合。

爲了測試正則表達式,這個網站是真的很酷:http://gskinner.com/RegExr/

隨着regexs,你必須嘗試猜測拼寫錯誤..

+0

感謝您的回覆。我正在查看該網站 –

0
  1. 完全正確的正則表達式:

    「大象」

  2. 正確雖然拼寫爲 「大象」 正則表達式: 「[^ E] lephants | E [^ 1] ephents |薩爾瓦多[^ E ] phants | Ele [^ p] hants | Elep [^ h]螞蟻| Eleph [^ a] nnts | Elepha [^ n] ts | Elephan [^ t] s | Elephant [^ s]「

  3. Answer接受正則表達式: 「lephants | Eephants | Elphants | Elehants | Elephants | Elephnts | Elephnts | Elephats | Elephans | Elephant」

你可以寫一個小程序,它會自動生成驗證你的答案和輸出你的情況下,正則表達式中,你的正則表達式下降

  • 正確
  • 正確雖然拼錯
  • 答案接受

例如,假設正確的答案是「大象」,你c應該寫一個例程,測試第二種情況(更正拼寫錯誤)。

String generateCorrectAltoughMispelledAnswerRegex(final String answer) { 
    StringBuilder builder = new StringBuilder(); 
    String answer = "Elephants"; 
    for (int i = 0; i < answer.length; i++) { 
     String mispelled = answer.substring(0, i) + "[^" + char.at(i) + "]" + 
      (i < length ? answer.substring(i + 1) : ""); 
     answer.append(mispelled); 
     if (i < length - 1) { answer.append("|"); } 
    } 
    String regex = builder.build(); 
    return regex; 
} 

例如:通過調用函數generateCorrectAlthoughMispelledAnswerRegex與變量 「大象」 generateCorrectAltoughMispelledAnswerRegex( 「大象」)

它將生成正則表達式到測試對於第二種情況:

"[^E]lephants|E[^l]ephents|El[^e]phants|Ele[^p]hants|Elep[^h]ants|Eleph[^a]nts|Elepha[^n]ts|Elephan[^t]s|Elephant[^s]" 

您可以對其他情況做同樣的事情。

+0

感謝您的回覆,我可以這麼做,但我必須爲測驗中的150個字符串做到這一點:S。那將是一場噩夢。但是再次感謝 –

+0

好的謝謝。這是一個非常好的解決方案。我會看到我可以在我的程序中實現此方法。 非常感謝,非常感謝 –

相關問題