好吧,這聽起來好像是一個重複的問題,但事實並非如此。我已經在this question here問過這個問題。我已將DocumentFilter
改寫爲使用正則表達式。在驗證個人姓名時,我只需要以下字符[a-zA-Z]
,'
,\S
和.
。爲什麼下面的正則表達式不允許數字?
我寫了我的正則表達式,希望它能解決這個問題。它正在按我想要的方式工作,但事實是,如果我還沒有設置數字,它就不允許數字,這令我感到困惑。
問題:爲什麼regex
不允許數字?
這是正則表達式[\\_\\(\\)@!\"#%&*+,-:;<>=?\\[\\]\\^\\~\\{\\}\\|]
,並進入它不應該允許在下面的代碼註釋:
我的DocumentFilter如下:
public class NameValidator extends DocumentFilter{
@Override
public void insertString(FilterBypass fb, int off
, String str, AttributeSet attr)
throws BadLocationException
{
// remove 0-9 !"#$%&()*+,-/:;<=>[email protected][\]^_`{|}~
fb.insertString(off, str.replaceAll("^[\\_\\(\\)@!\"#%&*+,-:;<>=?\\[\\]\\^\\~\\{\\}\\|]", ""), attr);
}
@Override
public void replace(FilterBypass fb, int off
, int len, String str, AttributeSet attr)
throws BadLocationException
{
// remove 0-9 !"#$%&()*+,-/:;<=>[email protected][\]^_`{|}~
fb.replace(off, len, str.replaceAll("^[\\_\\(\\)@!\"#%&*+,-:;<>=?\\[\\]\\^\\~\\{\\}\\|]", ""), attr);
}
}
這裏是我的測試類:
public class NameTest {
private JFrame frame;
public NameTest() throws ParseException {
frame = new JFrame();
initGui();
}
private void initGui() throws ParseException {
frame.setSize(100, 100);
frame.setVisible(true);
frame.setLayout(new GridLayout(2, 1, 5, 5));
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextField name = new JTextField(10);
((AbstractDocument)name.getDocument()).setDocumentFilter(new NameValidator());
frame.add(name);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
NameTest nt = new NameTest();
} catch (ParseException e) {
e.printStackTrace();
}
}
});
}
}
了'0-9'數字只是添加到正則表達式:'[0-9 \\ _ \\(\\ )@!\「#%&*+,-:; <> =?\\ [\\] \\^\\〜\\ {\\} \\ |]' –
@stribizhev呃,我的意思是說正則表達式不允許數字** BEROFE我已經把它設置成這樣做了,就像你以前所做的那樣,我正要按照你所做的那樣做,但在此之前它已經不允許使用數字了!我希望我已經解釋得更好了 – JWizard
@Giovanrich :我忽略了', - :',它確實已經捕獲了您刪除的數字。 –