Ну, это может звучать так, как если бы это был дублирующий вопрос, но это не так. Я задал этот вопрос в связи с 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 : Я забыл ', -:', он действительно уже фиксирует числа, которые вы удаляете. –