如何避免在以特定符号[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);
                    }
                }
            }

        });     
    }   
}

如何编辑此代码以避免高亮显示位于行中"#"符号之后的引用?谢谢你的帮助!

将模式替换为:

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

我使用的是一个正则表达式,该表达式具有负查找,#和关键字之间的长度最多为1000个字符。

最新更新