Tôi có một TextField trong javaFX nơi màu nền thay đổi tương ứng nếu nội dung hợp lệ hay không.Regex xác nhận các chuỗi csv
hợp lệ:
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
không hợp lệ:
0101 9 1 0 1 0
3124
0314 9
Về cơ bản:
- Chỉ số
- Đầu tiên nhóm 4 hoặc 9 chữ số
- Nếu nhóm đầu tiên 9 chữ số - > chỉ có hai nhóm trong tổng
- Nếu nhóm đầu tiên 4 chữ số -> ba, bốn hoặc năm nhóm trong tổng
- Nhóm hai và ba chữ số 1-9999
- Nhóm bốn và năm chữ số 0-9999
Bây giờ hãy nghĩ rằng một trong những dòng (hợp lệ) này là một dòng "Ident".
Các regex hiện nay là:
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+)";
Mà hoạt động tuyệt vời cho đến nay, nhưng bây giờ tôi muốn bao gồm csv. Vì vậy, tôi chỉ có thể nhập một định danh như tôi đã từng sử dụng hoặc nhiều id được phân tách bằng dấu phẩy (,), nhưng không quá năm id trong tổng số.
nỗ lực của tôi:
final String pattern = String.format("(%s,?\\s*){1,5}",base);
Điều này cho phép tôi để đầu vào này:
- Tất cả các dòng có giá trị trên
- 0101 9 1, 0101 9 2, 0101 9 3
- 0101 9 1, 987654321 21, 0101 9 3, 0101 9 4
Và nếu tôi nhập hơn 5 id thì nó sẽ không đúng. Nhưng nếu tôi nhập số nhận dạng không hợp lệ 0101 9 1 1 1 1 1 1 1 1 1 thì nó vẫn hợp lệ.
Mọi đề xuất? :)
EDIT: Đây là logic phù hợp:
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");
}
}
}
});
Tôi đang sử dụng com.google.common.base.Predicate cho phù hợp. Updatet câu hỏi của tôi với logic phù hợp. –
Tại sao không: (i) tách văn bản trên dấu phẩy (ii) kiểm tra xem mỗi mã định danh có hợp lệ với regex gốc của bạn và số lượng idents nhỏ hơn 6? – assylias
Sry, hai nhóm cuối cùng có thể có 0, updatet post. –