2013-04-08 2 views
0

У меня есть класс, который проверяет идентификатор, содержащуюся в сообщении, я пытался сделать это с помощью 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)).

+0

Оба метода действительны, вам должны быть осторожны с Шаблоном и Матчи, как вы можете имеют символы, не совместимые с regex, в 'String'. «Содержит» - лучший выбор. Возможно, добавьте несколько протоколов и используйте отладчик, чтобы узнать, что происходит. Также обычной идиомой для чтения из «BufferedReader» является 'if ((line = reader.readLine())! = Null'. –

+0

Я бы рекомендовал вместо операторов' if' использовать операторы 'switch'. это два оператора 'if', которые никогда не будут истинными. –

+0

, если они никогда не верны? Я пытался содержать, но он работает как find и не дает мне правильных результатов. – user2133558

ответ

0

Это означает, что сообщение не соответствует ни одной из строк в файле, но в файле есть не менее 5 строк внутри сообщение.

matches() проверяет, соответствует ли целая строка соответствует шаблону. Нет, если подстрока соответствует ему.

+0

Да, но find и String.contains проверяют, находится ли фаза фраз в сообщении isn'it? – user2133558

+0

'содержит() 'проверяет это.' find() 'проверяет, соответствует ли подстрока шаблону регулярного выражения. В чем проблема? Каковы входные данные (message и listeChaines)? Что вы ожидаете вместо того, что вы получаете? Как показывают комментарии, вы есть ошибки в ваших операторах if. м? –

+0

Для listeChaines вот список thta содержит обычные выражения для спама, сообщение содержит содержимое сообщения электронной почты. – user2133558

0

Проблема в том, что вы не считаете все вхождения. Вы просто проверяете, нашли ли Matcher что-то. Код:

if (chaineCourriel.matches()) 
    this.nbOccMotSpam++; 

Это должно выглядеть примерно так:

while (chaineCourriel.find()) 
    this.nbOccMotSpam++; 

Пожалуйста, смотрите мой маленький пример:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class SourceCodeProgram { 

    public static void main(String argv[]) throws Exception { 
     String once = "I contains one SPAM"; 
     String twice = "I contains two: SPAM and SPAM"; 
     String thrice = "I contains 3: SPAM and SPAM and ... again SPAM"; 

     System.out.println(countWordOccurrences(once, "SPAM")); 
     System.out.println(countWordOccurrences(twice, "SPAM")); 
     System.out.println(countWordOccurrences(thrice, "SPAM")); 
    } 

    private static int countWordOccurrences(String text, String word) { 
     Matcher matcher = Pattern.compile(word).matcher(text); 
     int count = 0; 
     while (matcher.find()) { 
      count++; 
     } 
     return count; 
    } 
} 

Выход:

1 
2 
3 
Смежные вопросы