正则表达式验证csv字符串

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)

基本上:

  • 只有数字
  • 第一组4或9位数
  • 如果第一组9位 - >总共只有两组
  • 如果第一组4位数 - >总共三个,四个或五个组
  • 第2组和第3组1-9999
  • 第4组和第5组0-9999

现在将这些(有效)行中的一行视为一个"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)

这使我可以输入:

  • 以上所有有效行
  • 0101 9 1,0101 9 2 0101 9 3
  • 0101 9 1,987654321 21,0101 9 3,0101 9 4

如果我输入超过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)

And*_*kov 3

正则表达式中的逗号是可选的,事实上允许“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)

另外,我建议使基地本身对您的输入规则更加严格,尽管它似乎与问题没有直接相关。