2014-05-06 28 views
1

我在JTextField上使用DocumentFilter,用於輸入員工的工作時間。該過濾器將確保輸入的限制僅爲4個字符並且僅允許數字。小數點可以使用也可以不使用,但應該只允許輸入一次,一旦輸入小數點,應該只允許多一個數字。含義9.5或10.5應該被接受,而8.45不被接受。在DocumentFilter中爲JTextField使用正則表達式時遇到問題

到目前爲止,我能夠獲得大約一半的所需功能。不能輸入超過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

數字過濾器在這裏經常出現 – mKorbel

+1

回答你最後一個問題:'^'在字符類('[]')定義中有特殊含義。否則,它只是意味着「字符串/行的開始」。 – tenub

回答

2

「我想不通是爲什麼恰好是一個正則表達式[^ 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(); 
    } 
} 

不知道這是否是您尋找的確切正則表達式。正則表達式不是我的特長。我從this question得到了正則表達式

+0

優秀的答案。我沒有意識到我之前失敗了,因爲過濾器每個角色都在使用它。我想我應該有,但我對Java仍然很陌生,基本上只是教我自己。 –