Я пытаюсь использовать библиотеку RichTextFX для отображения файла свойств в CodeArea
. Я создал несколько регулярных выражений для комментариев, а также свойства, чтобы попытаться присвоить стиль CodeArea
.
РЕДАКТИРОВАТЬ: Я могу заставить их работать должным образом. За исключением случаев, когда я добавляю комментарий к строке, которая имеет свойство. Мое регулярное выражение для определения свойства не может определить, когда в начале строки стоит #
. Я пытался, но не могу заставить его отрицать все остальное, если он видит, что в начале есть #
.
Вот два шаблона, которые я использую:
Pattern COMMENT = Pattern.compile("(?<SingleLineComment>#+)(?<Comment>.*\n)");
Pattern PROPERTY = Pattern.compile("(\n?(?<PropertyName>.+)(\\h*=\\h*)(?<PropertyValue>\\S+))");
Вот как они используются в коде:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import org.fxmisc.richtext.CodeArea;
import org.fxmisc.richtext.LineNumberFactory;
import org.fxmisc.richtext.model.StyleSpans;
import org.fxmisc.richtext.model.StyleSpansBuilder;
import java.util.Collection;
import java.util.Collections;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest extends Application
{
public static void main (String[] args) {
launch(args);
}
@Override
public void start (Stage primaryStage) throws Exception {
_area = new CodeArea();
_area.getStylesheets().add(getClass().getResource("/css/settings-design.css").toExternalForm());
_area.setParagraphGraphicFactory(LineNumberFactory.get(_area));
_area.textProperty().addListener((obs, oldValue, newValue) -> {
computeHighlighting(newValue);
});
primaryStage.setScene(new Scene(_area, 400, 600));
primaryStage.show();
_area.appendText(PROPERTIES);
}
private void computeHighlighting(String text) {
Matcher equalsTest = COMMENT.matcher(text);
while (equalsTest.find()){
_area.setStyle( equalsTest.start(), equalsTest.end(), Collections.singleton("comment"));
}
Matcher propertyMatcher = PROPERTY.matcher(text);
while (propertyMatcher.find()){
_area.setStyle(propertyMatcher.start(1), propertyMatcher.end(3), Collections.singleton("property-name"));
_area.setStyle(propertyMatcher.start(4), propertyMatcher.end(4), Collections.singleton("property-value"));
}
}
private CodeArea _area;
private static final Pattern COMMENT = Pattern.compile("(?<SingleLineComment>#+\\h*)(?<Comment>.*)\n?");
private static final Pattern PROPERTY = Pattern.compile("(?:[#].+|(\n?(?<PropertyName>.+)(\\h*=\\h*)(?<PropertyValue>\\S+)))");
private static final Pattern EQUALSTEST = Pattern.compile("=");
public static final String PROPERTIES = "#Tue Nov 06 12:42:33 CST 2018\n" +
"#prop0=true";
И code-area.css
:
.comment {
-fx-fill: #008e00;
}
.property-name {
-fx-fill: #ff8e31;
}
.property-value {
-fx-fill: #58a3ff;
}
Заранее благодарю за помощь!