2013-11-20 64 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