2015-04-22 2 views
0

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

     } 
    }); 
    } 
    } 
+1

Просто добавьте '0-9' номер в регулярное выражение:' [0-9 \\ _ \\ (\\) @! \ "#% &*+,-:; <> =? \\ [\\] \\^\\ ~ \\ {\\} \\ |]' –

+0

@stribizhev Ну, я имею в виду, что регулярное выражение НЕ позволяет номера ** BEROFE Я сделал это, чтобы сделать это **, так, как вы это делали выше. Я собирался сделать это так, как вы это сделали, но до этого он уже не позволяет номера! Надеюсь, я объяснил лучше. – JWizard

+0

@Giovanrich : Я забыл ', -:', он действительно уже фиксирует числа, которые вы удаляете. –

ответ

6

причина эта часть вашего регулярного выражения:

,-: 

Что соответствует любому знаку в диапазоне от , (ASCII 44) до : (ASCII 58), который включает в себя все номера (ASCII 48-57 включительно).

Если вы избежать - он должен работать нормально и не соответствует номерам:

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

или поместите его в начале или конце. – Braj

+1

'[, -:]' на самом деле соответствует ', -./0 1 2 3 4 5 6 7 8 9: ' –

+0

Очень хорошо, это то, что я искал! Спасибо - все, что я должен был сделать, это избежать этого. Я скоро приму ваш ответ. – JWizard

Смежные вопросы