Ola*_*lat 8 java regex csv validation javafx
我在javaFX中有一个TextField,其背景颜色相应地改变,如果内容是否有效.
有效:
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
Run Code Online (Sandbox Code Playgroud)
无效:
0101 9 1 0 1 0
3124
0314 9
Run Code Online (Sandbox Code Playgroud)
基本上:
现在将这些(有效)行中的一行视为一个"Ident".
目前的正则表达式是:
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+)";
Run Code Online (Sandbox Code Playgroud)
到目前为止工作得很好,但现在我想包括csv.所以我只能输入一个我以前使用的标识,或者用逗号(,)分隔的多个标识符,但总共不超过五个标识符.
我的尝试:
final String pattern = String.format("(%s,?\\s*){1,5}",base);
Run Code Online (Sandbox Code Playgroud)
这使我可以输入:
如果我输入超过5个ident,它将无效正确.但是如果我输入无效的身份0101 9 1 1 1 1 1 1 1 1它仍然有效.
有什么建议?:)
编辑:这是匹配逻辑:
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");
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
正则表达式中的逗号是可选的,事实上允许“0101 9 1 1 1 1 1 1 1 1 1”被自由解析为两个或多个记录。
要解决此问题,您可以要求它恰好是一个身份或多个以逗号分隔的身份:
final String pattern = String.format("(%s\\s*,\\s*){0,4}%s",base,base);
Run Code Online (Sandbox Code Playgroud)
另外,我建议使基地本身对您的输入规则更加严格,尽管它似乎与问题没有直接相关。
归档时间: |
|
查看次数: |
590 次 |
最近记录: |