几天来我一直在尝试解决这个问题,只是看不出它有什么问题。
该函数的想法是捕获垃圾邮件,因此它将要检查的电子邮件和包含要检查的单词的字符串数组作为参数,并根据所有单词构建正则表达式。然后使用构建的正则表达式字符串检查电子邮件的正文和主题是否包含任何单词,如果包含,则不应发布它。
它捕获我尝试过的垃圾邮件,但它也捕获所有其他邮件。
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;
}
ex 的正则表达式字符串。 垃圾邮件看起来像:(?i).[s\\s][p\\s][a\\s][m\\s]*
最佳答案
当您编写 (?i).* 时,它会匹配出现零次或多次的每个字符(不区分大小写)。
丢失 .* .
现在,如果过滤器中的第一个字符串是垃圾邮件,并且您有单词 s am,它将匹配它,因为您的正则表达式为 (?i)[s\s][p\s][a\s] [m\s]。因此它会查找 s 和 a 之间是否出现 p 或空白。
所以丢掉\s。
每个字符末尾的 * 表明您正在查找出现 0 次或多次的正则表达式。因此,即使该单词不存在,它也会返回 true。
所以, (?i)[s\s]* [p\s]* [a\s]* [m\s]* 意味着您希望该单词匹配,即使它出现 0 次或多次s 后跟 0 次或多次出现的 p,后跟 0 次或多次出现的 a,后跟 0 次或多次出现的 m。
所以丢掉*
最后,您的正则表达式应该匹配包含该词的每封邮件中的垃圾邮件一词,
(?i)[s][p][a][m] -- 不区分大小写 s 后跟 p 后跟 a 后跟 m
了解更多 here
编辑
也许这符合要求。
(?i).*[s]+[\\s]*[p]+[\\s]*[a]+[\\s]*[m]+[\\s]*.*
关于java - 构建正则表达式来捕获单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20103784/