簡體   English   中英

無法在DocumentFilter中為JTextField使用正則表達式

[英]Trouble using regex in DocumentFilter for JTextField

我在JTextField上使用DocumentFilter ,用於輸入員工的工作時間。 過濾器是為了確保輸入限制僅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();
    }
}

“我不知道是為什么正則表達式[^ 0-9]只能成功地允許數字”

傳遞給覆蓋的方法(按鍵入方式)的str只是單個字符,因為每次鍵入字符時都會調用過濾器方法。 正則表達式[^0-9]表示不是數字。 因此,當您執行str.replaceAll("[^0-9.]", "") ,您將向過濾器授予將字符插入文本字段的權限,只要它是一個數字,否則它將添加一個空字符/字符串,使用戶無法輸入字母。

話雖如此,至於真正的問題

“過濾器的作用是確保輸入限制的長度只能為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();
    }
}

不確定這是否是您要找的正則表達式。 正則表達式不是我的強項。 我從這個問題中得到了正則表達式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM