在DocumentFilter中使用正则表达式来解决JTextField问题

我在JTextField上使用DocumentFilter ,用于输入员工工作的时间。 filter是为了确保输入限制只有4个字符长,并且只允许数字。 可以使用或不使用小数,但只允许输入一次,输入小数后,应该只允许一个小数。 应接受9.5或10.5的含义,而不接受8.45。

到目前为止,我能够获得所需function的一半左右。 最多可输入4个字符,仅允许数字。 后者是使用replaceAll("[^0-9.]", "")方法完成的。

我花了很多时间观看教程,阅读文档和相关问题,比如这个 , 这个 ,特别是这个,但似乎无法获得正则表达式。 特别是我无法弄清楚的一件事是为什么[^0-9]的正则表达式只能成功地允许数字,但^\\d除非作为字符类包含,例如[\\d]

我的filter代码如下:

 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-9]的正则表达式只能成功地允许数字”

传递给重写方法的str (在输入方面)只是一个字符,因为每次键入字符时都会调用filter方法。 正则表达式[^0-9]意味着不是数字。 所以当你执行str.replaceAll("[^0-9.]", "") ,你给了filter权限,将字符插入文本字段,只要它是一个数字,否则它将添加一个空字符/字符串,使用户无法输入字母的效果。

话虽如此,至于真正的问题

“filter是为了确保输入的限制只有4个字符长并且只允许数字。可以使用或不使用小数但只允许输入一次,输入小数后,应该只允许还有一个数字。意思是9.5或10.5应该被接受而8.45不是。“

如上所述,传递给方法的str是单个字符,因此如果您尝试将完整的正则表达式传递给str.replaceAll()以匹配例如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(); } } 

不确定这是否是你想要的正确的正则表达式。 正则表达式不是我的强项。 我从这个问题得到了正则表达式