Mam TextField w javaFX, gdzie kolor tła zmienia się odpowiednio, jeśli treść jest ważna, czy nie.Regex sprawdzania ciągi csv
Ważny:
987654321 1
987654321 21
0101 9 1
1701 91 1 2
4101 917 1 0 43
0801 9 178 2 0
0111 9 1 084 0
Nieprawidłowy:
0101 9 1 0 1 0
3124
0314 9
Zasadniczo:
- Tylko cyfry
- pierwszej grupie 4 lub 9 cyfr
- W przypadku pierwszej grupy 9 cyfr - > jedynie dwie grupy w całości
- Jeśli pierwsza grupa 4 cyfry -> trzy, cztery lub pięć grup w ogóle
- grupy drugiej i trzeciej cyfry 1-9999
- Grupa cztery i pięć cyfr 0-9999
Teraz pomyśl jedną z tych (ważnych) linii jako jedną "Tożsamość".
Obecny regex jest:
final String base = "(\\d+\\s+\\d+)|(\\d+\\s+\\d+\\s+\\d+(\\s+\\d+)?(\\s+\\d+)?)|(\\d+\\s+\\d+\\s+\\d+)|(\\d+\\s+\\d+\\s+\\d+\\s+\\d+)|(\\d+\\s+\\d+\\s+\\d+\\s+\\d+\\s+\\d+)";
Wich działa świetnie do tej pory, ale teraz chcę to CSV. Mogę więc wpisać tylko jeden identyfikator taki, jakiego użyłem, lub wiele identyfikatorów oddzielonych przecinkiem (,), ale nie więcej niż pięć identyfikatorów łącznie.
Moja próba:
final String pattern = String.format("(%s,?\\s*){1,5}",base);
To pozwala mi na wejście tego:
- Wszystkie ważne linie powyżej
- 0101 9 1, 0101 9 2, 0101 9 3
- 0101 9 1, 987654321 21, 0101 9 3, 0101 9 4
A jeśli wprowadzę więcej niż 5 identyfikatorów, okaże się on nieprawidłowy. Ale jeśli wprowadzę niepoprawny identyfikator 0101 9 1 1 1 1 1 1 1 1 1, to nadal będzie on ważny.
Wszelkie sugestie? :)
EDIT: To jest logika dopasowanie:
private final Predicate<String> typingPredicate = new Predicate<String>() {
@Override
public boolean apply(String input) {
return input.matches(pattern);
}
};
textField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observableValue, String previous, String current) {
if (current != null) {
if (StringUtils.isEmpty(current) || typingPredicate.apply(current.trim())) {
textField.getStyleClass().removeAll("invalid");
} else {
textField.getStyleClass().add("invalid");
}
}
}
});
Używam com.google.common.base.Predicate dopasowywania. Updatet moje pytanie z pasującą logiką. –
Dlaczego nie: (i) podzielić tekst na przecinki (ii) sprawdzić, czy każdy identyfikator jest ważny z oryginalnym wyrażeniem regularnym, a liczba identyfikatorów jest mniejsza niż 6? – assylias
Sry, dwie ostatnie grupy mogą mieć 0, post aktualizacji. –