RichTextFX комментарий и регулярное выражение свойства - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь использовать библиотеку 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;
}

Заранее благодарю за помощь!

1 Ответ

0 голосов
/ 08 ноября 2018

Вот регулярное выражение для разбора строки файла свойств в части комментария ключ-разделитель-значение, что является жалобой Java.

^\s*(?:|(?<PropertyName>\w+(?:\.\w+)*)(?<Divider>\s*[=: ]\s*)(?<PropertyValue>\w(?:.|\\,|\\[\n\r\f\v]+)*))(?<Comment>[#!].*)?$

Обратите внимание, что это регулярное выражение еще не является исчерпывающим, и встроенный класс Properties гораздо больше подходит для этой задачи, чем регулярное выражение. (Используйте функцию загрузки для разбора источника, и тогда он в основном работает как карта)

...