JavaFX-带有正则表达式的文本字段,用于邮政编码

时间:2019-06-04 14:39:05

标签: regex javafx textfield zipcode

对于我的程序,我想使用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;
        }
    }

2 个答案:

答案 0 :(得分:0)

您的原始表达式应该可以正常工作,但是,如果我们希望验证一个五位数的邮政编码,我们可能希望删除0量词:

^[0-9]{5}$
^\d{5}$

出于验证目的,我们可能希望保留开始和结束锚点,但是仅出于测试目的,我们可以删除并查看:

[0-9]{5}
\d{5}

其他一些字符可能会通过我们不希望拥有的输入得到。

Demo

测试

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);