Java 检查消息是否包含字符串
我有一个类可以检查消息中包含的短语的id,我尝试使用Java 检查消息是否包含字符串,java,string,contains,Java,String,Contains,我有一个类可以检查消息中包含的短语的id,我尝试使用匹配器和模式以及字符串.contains(),但返回的结果很奇怪 下面是课堂: public class MotsClesFilter implements EmailFilter { final String NAME = "Filtrage par mots cles"; /*private Pattern chaineSpam; private Matcher chaineCourriel;*/ priv
匹配器
和模式
以及字符串.contains()
,但返回的结果很奇怪
下面是课堂:
public class MotsClesFilter implements EmailFilter {
final String NAME = "Filtrage par mots cles";
/*private Pattern chaineSpam;
private Matcher chaineCourriel;*/
private int nbOccMotSpam;
private byte confidenceLevel;
@Override
public String getFilterName() {
return this.NAME;
}
@Override
public byte checkSpam(MimeMessage message) {
analyze(message);
if(this.nbOccMotSpam==0)
this.confidenceLevel = 1;
else if (this.nbOccMotSpam>0 && this.nbOccMotSpam<2)
this.confidenceLevel = CANT_SAY;
else if (this.nbOccMotSpam>1 && this.nbOccMotSpam<3)
this.confidenceLevel = 50;
else if (this.nbOccMotSpam>3 && this.nbOccMotSpam<4)
this.confidenceLevel = 65;
else if (this.nbOccMotSpam>4 && this.nbOccMotSpam<5)
this.confidenceLevel = 85;
else this.confidenceLevel = 90;
return (getConfidenceLevel());
}
public void analyze(MimeMessage message){
try {
List<String> listeChaines = new ArrayList<String>();
BufferedReader bis = new BufferedReader(new InputStreamReader(new FileInputStream(new File("SpamWords.txt"))));
while(bis.ready()){
String ligne = bis.readLine();
listeChaines.add(ligne);
}
String mail = ((String.valueOf(message.getContent())));
//System.out.println(mail);
for (int j =0; j<listeChaines.size();j++){
//System.out.println(listeChaines.get(j));
Pattern chaineSpam = Pattern.compile(listeChaines.get(j),Pattern.CASE_INSENSITIVE);
Matcher chaineCourriel = chaineSpam.matcher(mail);
if (chaineCourriel.matches())
this.nbOccMotSpam++;
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public byte getConfidenceLevel() {
// TODO Auto-generated method stub
return this.confidenceLevel;
}
@Override
public boolean enabled() {
// TODO Auto-generated method stub
return true;
}
}
公共类MotsClesFilter实现EmailFilter{
最后的字符串名称=“过滤过滤”;
/*私有模式链;
私人匹配器*/
私人int nbOccMotSpam;
私有字节信任度;
@凌驾
公共字符串getFilterName(){
返回此.NAME;
}
@凌驾
公用字节检查垃圾邮件(MimeMessage消息){
分析(信息);
if(this.nbOccMotSpam==0)
这个。自信水平=1;
否则,如果(this.nbOccMotSpam>0&&this.nbOccMotSpam1&&this.nbOccMotSpam3&&this.nbOccMotSpam4&&this.nbOccMotSpam,则表示消息与文件中的任何字符串都不匹配,但在消息中至少可以找到5个字符串
matches()
检查整个字符串是否与模式匹配。如果某些子字符串与模式匹配则不检查。这两种方法都有效,您必须小心使用模式和匹配器,因为字符串中可能有不兼容正则表达式的字符。
包含是更好的选择。可能添加一些日志记录并使用调试器查看发生了什么另外,从BufferedReader
读取的常用习惯用法是if((line=reader.readLine())!=null
。我建议使用switch
语句,而不是那些if
语句。此外,有两个if
语句永远不会为真。哪两个if
语句永远不会为真?我尝试了contains,但它的工作方式与find类似,并且没有给出正确的结果。如果数字是3或4,将执行else子句d、 我怀疑这是您想要的。整数不能同时大于3和小于4。是的,但find和String.contains检查wole pharase是否在消息中,是吗?contains()
检查这一点。find()
检查子字符串是否与regex模式匹配。有什么问题吗?输入(消息和列表链)是什么?你期望得到什么而不是得到什么?正如评论所指出的,你的if语句中有错误。这就是问题所在吗?对于ListChaines,这里是一个列表,它包含常见的垃圾邮件表达式,消息包含电子邮件的内容。这没有帮助。所有这些字符串的内容是什么。给定这些输入,你的输出是什么展望未来,你会得到什么样的结果。从你发布的信息来看,90可能是一个预期的结果。我已经解决了这个问题,我认为现在一切都好了,谢谢大家。