2016-04-08 12 views
7

Tôi đang thực hiện một trình soạn thảo văn bản tìm chuỗi trong dòng đầu tiên của văn bản và đánh dấu nó và các lần xuất hiện của nó trong suốt văn bản. Vấn đề là nó cũng làm nổi bật các lần xuất hiện nằm trong các dòng chú thích (bắt đầu bằng "#"). Đây là mã của tôi cho đến nay:Làm thế nào để tránh làm nổi bật văn bản của một chuỗi trong một dòng bắt đầu bằng một biểu tượng cụ thể [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); 
        } 
       } 
      } 


     });  
    } 
} 

Làm thế nào tôi có thể chỉnh sửa mã này để tránh làm nổi bật lần xuất hiện nằm sau dấu "#" biểu tượng trong một dòng? Cảm ơn sự giúp đỡ của bạn!

Trả lời

3

Thay thế mô hình với:

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

tôi đang sử dụng một biểu thức chính quy với lookbehind tiêu cực và chiều dài lên đến 1000 ký tự giữa # và từ khóa.

+0

hoạt động! cảm ơn bạn! – Pino

Các vấn đề liên quan