[英]Filtering a JTextField for strings, space and a dot (.) using a DocumentFilter
[英]Trouble using regex in DocumentFilter for JTextField
我在JTextField
上使用DocumentFilter
,用於輸入員工的工作時間。 過濾器是為了確保輸入限制僅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-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.