我在DocumentFilter
上使用JTextField
,用于输入员工工作的时间。过滤器是为了确保输入限制只有4个字符长,并且只允许数字。可以使用或不使用小数,但只允许输入一次,输入小数后,应该只允许一个小数。应接受9.5或10.5的含义,而不接受8.45。
到目前为止,我能够获得所需功能的一半左右。最多可输入4个字符,仅允许数字。后者是使用replaceAll("[^0-9.]", "")
方法完成的。
我花了很多时间观看教程,阅读文档和相关问题,例如this,this,尤其是this,,但似乎无法得到正则表达式完全执行。有一点特别是我无法弄清楚为什么[^0-9]
的正则表达式只能成功地允许数字,但^\\d
除非被包含为[\\d]
这样的字符类
我的过滤器代码如下:
import java.awt.Toolkit;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class TimeWorkedFilter extends DocumentFilter {
private int maxCharacters;
public TimeWorkedFilter(int maxChars) {
maxCharacters = maxChars;
}
//"[^0-9.]
public void insertString(FilterBypass fb, int offs, String str, AttributeSet a)
throws BadLocationException {
if ((fb.getDocument().getLength() + str.length()) <= maxCharacters)
super.insertString(fb, offs, str.replaceAll("[^0-9.]", ""), a);
else
Toolkit.getDefaultToolkit().beep();
}
public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a)
throws BadLocationException {
if ((fb.getDocument().getLength() + str.length()
- length) <= maxCharacters)
super.replace(fb, offs, length, str.replaceAll("[^0-9.]", ""), a);
else
Toolkit.getDefaultToolkit().beep();
}
}
答案 0 :(得分:2)
&#34;我无法弄清楚为什么[^ 0-9]的正则表达式只能成功地允许数字&#34;
传递给重写方法的str
(就输入而言)只是一个字符,因为每次键入字符时都会调用过滤方法。正则表达式[^0-9]
表示不是数字。因此,当您执行str.replaceAll("[^0-9.]", "")
时,您将赋予过滤器权限以将字符插入文本字段,只要它是一个数字,否则它将添加一个空字符/字符串,从而产生效果用户无法输入信件。
话虽如此,至于真正的问题
&#34;过滤器是为了确保输入限制只有4个字符长,并且只允许数字。可以使用或不使用小数,但只允许输入一次,输入小数后,应该只允许一个小数。应接受9.5或10.5的含义,而不是8.45。&#34;
如上所述,传递给该方法的str
是一个字符,因此如果您尝试将完整的正则表达式传递给str.replaceAll()
以匹配说8.9
,则会赢得&# 39;工作。 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();
}
}
不确定这是否是您正在寻找的正确的正则表达式。正则表达式不是我的强项。我从this question
获得了正则表达式