У меня есть класс, который проверяет идентификатор, содержащуюся в сообщении, я пытался сделать это с помощью Matcher
и Pattern
и с String.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;
}
}
Результаты, возвращаемые checkSpam
всегда 1, если использовать спички и 90, если я использую найти, она также возвращает 90, когда я использую mail.contains(listeChaines.get(j))
.
Оба метода действительны, вам должны быть осторожны с Шаблоном и Матчи, как вы можете имеют символы, не совместимые с regex, в 'String'. «Содержит» - лучший выбор. Возможно, добавьте несколько протоколов и используйте отладчик, чтобы узнать, что происходит. Также обычной идиомой для чтения из «BufferedReader» является 'if ((line = reader.readLine())! = Null'. –
Я бы рекомендовал вместо операторов' if' использовать операторы 'switch'. это два оператора 'if', которые никогда не будут истинными. –
, если они никогда не верны? Я пытался содержать, но он работает как find и не дает мне правильных результатов. – user2133558