“我不知道是为什么正则表达式[^ 0-9]只能成功地允许数字”
将
str传递到您的覆盖方法(在打字方面)是只有一个字符,作为过滤方法被调用每次你在一个字符输入时间。正则表达式
[^0-9]不是数字。因此,当您执行时
str.replaceAll("[^0-9.]",""),您将向过滤器授予将字符插入文本字段的权限,只要该字符是数字,否则它将添加一个空字符/字符串,从而使用户无法输入字母。话虽如此,至于真正的问题
“过滤器的作用是确保输入限制的长度只能为4个字符,并且只能允许数字。可以使用或可以不使用十进制,但只能输入一次,一旦输入十进制,则只能输入再加上一个数字。意味着应该接受9.5或10.5,而不能接受8.45。”
如上所述,
str传递给方法的字符是单个字符,因此,如果您尝试将完整的正则表达式传递给,
str.replaceAll()以匹配say
8.9,那么它将不起作用。中的正则表达式
replaceAll()仅用于检查单个字符(在这种情况下)。
相反,您可以做的是从文档中获取文本,将串联
str到文档中,然后查看总文本是否
matches()为完整的正则表达式。就像是
public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException { String text = fb.getdocument().getText(0, fb.getdocument().getLength()); text += str; if ((fb.getdocument().getLength() + str.length() - length) <= maxCharacters && text.matches("^[0-9]+[.]?[0-9]{0,1}$")) { super.replace(fb, offs, length, str, a); } else { Toolkit.getDefaultToolkit().beep(); }}不确定这是否是您要查找的正则表达式。正则表达式不是我的强项。



