如何避免在以特定符号 [java] 开头的行中突出显示文本字符串
How to avoid text highlighting of a string in a line starting with a specific symbol [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 个字符。
我正在制作一个文本编辑器,它可以在文本的第一行中找到一个字符串,并突出显示它及其在整个文本中出现的位置。问题在于它还会突出显示位于注释行中的事件(以“#”开头)。 到目前为止,这是我的代码:
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 个字符。