gpt4 book ai didi

java - 正则表达式验证 csv 字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:48:16 25 4
gpt4 key购买 nike

我在 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

无效:

0101 9 1 0 1 0
3124
0314 9

基本上:

  • 只有数字
  • 第一组 4 或 9 位数字
  • 如果第一组9位->总共只有两组
  • 如果第一组4位->一共三四五组
  • 1-9999 两位和三位数字
  • 四五位数字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+)";

到目前为止效果很好,但现在我想包括 csv。所以我可以像以前一样只输入一个标识,或者用逗号 (,) 分隔多个标识,但总共不超过五个标识。

我的尝试:

final String pattern = String.format("(%s,?\\s*){1,5}",base);

这使我能够输入:

  • 以上所有有效行
  • 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 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");
}
}
}
});

最佳答案

正则表达式中的逗号是可选的,这样“0101 9 1 1 1 1 1 1 1 1 1”可以自由地解析为两条或更多条记录。

要解决此问题,您可以要求它是一个标识或多个以逗号分隔的标识:

final String pattern = String.format("(%s\\s*,\\s*){0,4}%s",base,base);

此外,我建议让 base 本身在您的输入规则方面更加严格,尽管它似乎与问题没有直接关系。

关于java - 正则表达式验证 csv 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33757280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com