2013-11-20 61 views
0

一直試圖解決這個問題幾天,現在只是看不到什麼是不正確的。建立正則表達式來抓詞

功能的想法是捕獲垃圾郵件,因此它需要的參數進行檢查電子郵件,對被檢查包含單詞一個字符串數組,並建立一個正則表達式出的一切話。然後使用內置的正則表達式字符串檢查電子郵件的正文和主題,如果它包含任何單詞,如果它不應該發佈它。

它捕獲我嘗試過的垃圾郵件,但它也捕獲所有其他郵件。

private boolean isSpam(Mail mail, String[] filter){ 
    StringBuilder sb = new StringBuilder(); 

    // Build the regex String for each string in filter 
    for(int i=0;i<filter.length;i++){ 
     sb.append("(?i).*"); 
     for(int ii = 0;ii<filter[i].length();ii++){ 
      sb.append("[" + filter[i].charAt(ii) + "\\s]*"); // [x\\s]*; x = current letter 
     } 
     filter[i] = sb.toString(); 
     sb.delete(0, sb.length()); 
    } 

    for(int i=0;i<filter.length;i++){ 
     if(mail.getSubject().matches(filter[i]) || mail.getMessage().matches(filter[i])){ 
      return true; 
     } 
    } 
    return false; 
} 

前者的正則表達式字符串。 垃圾郵件看起來像:(?i)。 [S \\ S] [P \\ S] [A \\ S] [M \\秒] *

+0

你對每個字符檢查? – Adarsh

+1

你是否試圖爲幾個單詞做一個不區分大小寫的子字符串?正如所寫,該正則表達式將匹配「」。我有一種感覺,你想要的更像(?)spam1 | spam2 | spam3。 –

+0

@David Ehrmann我是,但我也希望它檢測這些詞如果包含空格或重複的字母的出現。爲什麼我的當前正則表達式匹配「」? –

回答

1

當你寫*,它爲每一個字符匹配(不區分大小寫)發生零次或多次。

失去。*。

現在,如果過濾器中的第一個字符串是垃圾郵件,並且您有單詞s am,它將匹配它,因爲您的正則表達式爲(?i)[s \ s] [p \ s] [a \ s ] [m \ s]。因此,它會查找s和a之間的p或空格。

所以失去了\ s。

在每一個字符的結束時的*表明,你正在尋找的正則表達式表達發生0次或更多次。所以即使這個詞不存在,它也會重現真實。

因此,(?i)[s \ s] * [p \ s] * [a \ s] * [m \ s] *意味着即使它有0個或更多發生s後跟0次或多次發生p跟隨0次或多次發生m後跟0次或多次發生。

因此失去*

到底你的正則表達式匹配中包含這個詞應該是每一個郵件字垃圾郵件,

(我)[S] [P] [A] [M] - 不區分大小寫秒,然後用p接着是隨後米

更多here

EDIT

也許這符合要求。

(?i).*[s]+[\\s]*[p]+[\\s]*[a]+[\\s]*[m]+[\\s]*.* 
+0

Whops,忘記提及一些具體細節:即使它包含重複的字母或空格,我也希望它檢測到這些單詞。 –

+0

所以如果郵件中有這些單詞「Crisp MASAS」和「Crisspp AAAA MMMMASAS」..它應該與垃圾郵件相匹配嗎? – Adarsh

+0

是的,遠不是一個好的過濾器,但這就是我至少要做的。 –

0

我最近寫了一褻瀆檢查,看起來像這樣。如果一些文本包含的任何褻瀆,卻遭到了拒絕

public Map<Boolean, String> TextContainsProfanity(String adText,Pattern filter) { 
    Boolean profanity = false; 
    Map<Boolean, String> results = new HashMap<Boolean, String>(); 
    StringBuilder sb = new StringBuilder(); 

    Matcher m = filter.matcher(adText); 
    sb.append(" : "); 
    while (m.find()) { 
     sb.append(m.group()); 
     sb.append(" "); 
     profanity = true; 
    } 
    results.put(profanity, sb.toString()); 
    return results; 
} 

壞字的正則表達式字符串看着這本:(我)。

\bBAD\b|\bTERRIBLE\b|\bOFFENSIVE\b