为什么以下正则表达式不允许数字?

时间:2015-04-22 09:02:02

标签: java regex swing jtextfield documentfilter

嗯,这可能听起来好像是一个重复的问题,但事实并非如此。我已经就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 !"#$%&()*+,-/:;<=>?@[\]^_`{|}~
    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 !"#$%&()*+,-/:;<=>?@[\]^_`{|}~
    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();
            }

        }
     });
    }
  }

1 个答案:

答案 0 :(得分:6)

原因是你的正则表达式的这一部分:

,-:

匹配,(ASCII 44)到:(ASCII 58)范围内的任何字符,其中包括所有数字(包括ASCII 48-57)。

如果你逃脱-它应该可以正常工作而不匹配数字:

[\\_\\(\\)@!\"#%&*+,\\-:;<>=?\\[\\]\\^\\~\\{\\}\\|]