当前位置: 首页 > 面试题库 >

无法在DocumentFilter中为JTextField使用正则表达式

邓令雪
2023-03-14
问题内容

我使用的是DocumentFilterJTextField其中使用的雇员曾经工作的时间量进入。过滤器是为了确保输入的限制仅4个字符长,并且只允许数字。可以使用或不使用十进制,但只能输入一次,一旦输入十进制,则只能再输入一个数字。意思是9.5或10.5,不能接受8.45。

到目前为止,我已经能够获得所需功能总数的一半。最多只能输入4个字符,并且只能输入数字。后者使用该replaceAll("[^0-9.]", "")方法完成。

我花了很多时间观看教程,阅读文档以及诸如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-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();
    }
}

不确定这是否是您要查找的正则表达式。正则表达式不是我的强项。



 类似资料:
  • 问题内容: 我有一个带有div的html页面,这些div的 ID 为 s1 , s2 等形式。 我想将CSS属性应用于这些部分/ div的子集(取决于id)。但是,每次添加 div时 ,都必须像这样分别为该部分添加css。 css中是否有类似正则表达式的内容,可用于将样式应用于一组 div 。 问题答案: 您可以设法选择那些元素而无需任何形式的正则表达式,如先前的答案所示,但是要直接回答问题,可以

  • 下面是我正在使用的正则表达式的最新版本,它抛出了错误“Invalid regular expression” XSD:正则表达式在位置4验证失败:当前选项设置不支持此表达式。 我在xsd文件中得到了这个异常,我正在message broker(IIB)中开发这个xsd。有谁能帮我解决这个问题吗?

  • 行动时刻 - 使用正则表达式 Unlang允许在条件检查中进行正则表达式计算。这些通常是Posix正则表达式。运算符=〜和!〜与正则表达式相关联。为了简单的概念证明,我们将修改上一个练习: 1.编辑FreeRADIUS配置目录下的sites-available / default虚拟服务器,并在该部分顶部的post-auth部分中添加以下内容: if(request:Framed-Protocol

  • sorter: "${$(...props)=>{timeSort(createTime)}$}$", ..$}$"."${$.. 希望结果 :sorter: (...props)=>{timeSort(createTime)}, ..$}$"."${$.. 规则: "${$ 和 $}$" 是一对,将他们替换为空。

  • 本文向大家介绍在JavaScript的正则表达式中使用exec()方法,包括了在JavaScript的正则表达式中使用exec()方法的使用技巧和注意事项,需要的朋友参考一下  exec方法为正则表达式匹配的文本搜索字符串。如果找到匹配,则返回结果数组; 否则,返回null。 语法 下面是参数的详细信息:     string : 要搜索的字符串 返回值: 如果找到一个匹配,如果不为空,则返回匹配

  • 问题内容: 我在理解ElasticSearch中的regexp机制时遇到了麻烦。我有代表物业单位的文件: 从今天开始,DailyAvailability字段按天数对未来两年的财产可用性进行编码。’A’表示可用,’U’不可删除,’I’可以签入,’O’可以签出。如何编写正则表达式过滤器以获取特定日期可用的所有单位? 我试图在DailyAvailability字段中找到具有特定长度和偏移量的’A’子字符