2016-04-08 14 views
7

Ich mache einen Texteditor, der eine Zeichenfolge in der ersten Zeile eines Texts findet und sie und seine Vorkommen im gesamten Text hervorhebt. Das Problem ist, dass es auch die Vorkommen in den Kommentarzeilen hervorhebt (mit "#" begonnen). Dies ist mein Code so weit:So vermeiden Sie die Texthervorhebung einer Zeichenfolge in einer Zeile, die mit einem bestimmten Symbol beginnt [java]

import javax.swing.*; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DefaultHighlighter; 
import javax.swing.text.Highlighter; 

import java.awt.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
class TextArea { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("textArea"); 
     frame.setSize(500,500); 

     final JTextArea textArea = new JTextArea() ; 
     frame.add(textArea); 

     frame.setVisible(true); 

     textArea.getDocument().addDocumentListener(new DocumentListener(){ 

      @Override 
      public void changedUpdate(DocumentEvent e) { 
       try { 
        String keyWords = findKeyWord(); 
        findOccurrences(keyWords); 
       } catch (BadLocationException ex) { 
        Logger.getLogger(TextArea.class.getName()).log(Level.SEVERE, null, ex); 
       } 

      } 

      @Override 
      public void insertUpdate(DocumentEvent e) { 
       try { 
        String keyWords = findKeyWord(); 
        findOccurrences(keyWords); 
       } catch (BadLocationException ex) { 
        Logger.getLogger(TextArea.class.getName()).log(Level.SEVERE, null, ex); 
       } 

      } 

      @Override 
      public void removeUpdate(DocumentEvent e) { 
       try { 
        String keyWords = findKeyWord(); 
        findOccurrences(keyWords); 
       } catch (BadLocationException ex) { 
        Logger.getLogger(TextArea.class.getName()).log(Level.SEVERE, null, ex); 
       } 

      } 

      public String findKeyWord() throws BadLocationException { 
       String keyWord = ""; 

       for(String line : textArea.getText().split("\n")){ 
        if (line.trim().length() > 0) { 
         if(!line.startsWith("#")){        
          int keywordEndPosition = line.indexOf("#"); 
          keyWord = line.substring(0, keywordEndPosition == -1 ? line.length() : keywordEndPosition); 
          keyWord = keyWord.trim(); 
          break; 
         } 
        }      

       }     
      return keyWord;     
      } 

      public void findOccurrences(String keyWords) throws BadLocationException { 
       Highlighter highlighter = textArea.getHighlighter(); 
       DefaultHighlighter.DefaultHighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(Color.CYAN); 
       String[] keyArray; 
       highlighter.removeAllHighlights(); 

       keyArray = keyWords.split("[(,)]"); 
       for (int i=0; i<keyArray.length; i++) { 
        keyArray[i] = keyArray[i].trim();    } 

       for (String keyWord : keyArray) { 
        if (keyWord.isEmpty()) 
         return; 

        Pattern pattern = Pattern.compile(Pattern.quote(keyWord)); 
        Matcher matcher = pattern.matcher(textArea.getText()); 


        while(matcher.find()) { 
         highlighter.addHighlight(matcher.start(), matcher.end(), painter); 
        } 
       } 
      } 


     });  
    } 
} 

Wie kann ich diesen Code bearbeiten Hervorhebung der Vorkommen nach einem Symbol „#“ in einer Linie angeordnet zu vermeiden? Danke für Ihre Hilfe!

Antwort

3

Ersetzen Sie das Muster mit:

Pattern pattern = Pattern.compile("(?<!#.{0,1000})" + Pattern.quote(keyWord)); 

i einen regulären Ausdruck mit negativen Lookbehind verwende und einer Länge von bis zu 1000 Zeichen zwischen # und dem Schlüsselwort.

+0

das funktioniert! Danke! – Pino