如何避免以特定符号开头的行中字符串的文本突出显示[java]

Posted

技术标签:

【中文标题】如何避免以特定符号开头的行中字符串的文本突出显示[java]【英文标题】:How to avoid text highlighting of a string in a line starting with a specific symbol [java] 【发布时间】:2016-07-29 21:33:55 【问题描述】:

我正在制作一个文本编辑器,它在文本的第一行中找到一个字符串,并突出显示它以及它在整个文本中的出现。问题是它还突出显示了位于注释行中的事件(以“#”开头)。 到目前为止,这是我的代码:

    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);
                    
                
            


        );     
       

如何编辑此代码以避免突出显示位于一行中“#”符号之后的事件? 感谢您的帮助!

【问题讨论】:

【参考方案1】:

将模式替换为:

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

我正在使用正则表达式,它带有负向回溯,并且 # 和关键字之间的长度最多为 1000 个字符。

【讨论】:

以上是关于如何避免以特定符号开头的行中字符串的文本突出显示[java]的主要内容,如果未能解决你的问题,请参考以下文章

显示字符串列以特定字母开头的行[重复]

jQuery:如何突出显示输入框中的文本?

如何以角度突出显示文本区域中的文本?

突出显示类似于 grep 的文本,但不过滤掉文本 [重复]

突出显示 JTextPane 中的当前行

如何突出显示在 div 中的字符串中的特定文本?