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

时间:2014-05-06 18:04:50

标签: java regex swing jtextfield documentfilter

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

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

我花了很多时间观看教程,阅读文档和相关问题,例如thisthis,尤其是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();
    }
}

1 个答案:

答案 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

获得了正则表达式