对于我的程序,我想使用TextField,用户可以在其中输入邮政编码(德语)。为此,我尝试了以下内容。如果用户输入的数字多于5位,则应立即删除每增加一位。当然不允许字母。
当我在https://regex101.com/上使用这种模式^ [0-9] {0,5} $时,它可以达到我想要的目的,但是当我在JavaFX中尝试使用它时,它就无法工作。但是我找不到解决办法。
谁能告诉我我做错了什么?
编辑:对于尚未使用JavaFX的用户:当用户仅输入一个字符时,将调用check(String text)方法。因此,当有1到5位数字时,结果也应为true。但不多;-)
public class NumberTextField extends TextField{
ErrorLabel label;
NumberTextField(String text, ErrorLabel label){
setText(text);
setFont(Font.font("Calibri", 17));
setMinHeight(35);
setMinWidth(200);
setMaxWidth(200);
this.label = label;
}
NumberTextField(){}
@Override
public void replaceText(int start, int end, String text){
if(check(text)) {
super.replaceText(start, end, text);
}
}
@Override
public void replaceSelection(String text){
if(check(text)){
super.replaceSelection(text);
}
}
private boolean check(String text){
if(text.matches("^[0-9]{0,5}$")){
label.setText("Success");
label.setBlack();
return true;
} else{
return false;
}
}
答案 0 :(得分:0)
您的原始表达式应该可以正常工作,但是,如果我们希望验证一个五位数的邮政编码,我们可能希望删除0
量词:
^[0-9]{5}$
^\d{5}$
出于验证目的,我们可能希望保留开始和结束锚点,但是仅出于测试目的,我们可以删除并查看:
[0-9]{5}
\d{5}
其他一些字符可能会通过我们不希望拥有的输入得到。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
final String regex = "^[0-9]{5}$";
final String string = "01234\n"
+ "012345\n"
+ "0\n"
+ "1234";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
答案 1 :(得分:0)
您无需扩展TextField
即可执行此操作。实际上,我建议使用TextFormatter
,因为它更易于实现:
它不需要您覆盖多种方法。您只需要根据所需输入的数据来决定是否允许更改。
final Pattern pattern = Pattern.compile("\\d{0,5}");
TextFormatter<?> formatter = new TextFormatter<>(change -> {
if (pattern.matcher(change.getControlNewText()).matches()) {
// todo: remove error message/markup
return change; // allow this change to happen
} else {
// todo: add error message/markup
return null; // prevent change
}
});
TextField textField = new TextField();
textField.setTextFormatter(formatter);