2015-03-04 1 views
1

J'ai un formulaire (JTable) pour demander l'accès au pare-feu. Pour le JTextField dans lequel l'utilisateur doit entrer les sources, je voudrais vérifier l'entrée en temps réel pendant que l'utilisateur tape. Les entrées valides seront surlignées en vert. Invalide ne devrait pas être autorisé.Vérifier l'entrée dans JTextField En temps réel

Les regex suivantes sont entrées valides:

private static final String IP_Address = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\d";//56.1.2.3 
private static final String IP_WithMask = "(\\d{1,3}.){3}(\\d{1,3})(?:\\s+[255])(\\d{1,3}.){3}(\\d{1,3})"; //56.1.2.3 255.255.255.254 
private static final String IP_CIDR = "(\\d{1,3}.){3}(\\d{1,3})(?:\\s*/)(\\d{1,3})"; //56.1.2.3/24 
private static final String IP_ADDRESS_Dash_Numeric_RANGE = "((\\d{1,3}.){3}(\\d{1,3})(?:\\s*-)(\\d{1,3}))";// 56.1.2.3-4 
private static final String IP_ADDRESS_Dash_ADDRESS_RANGE = "((\\d{1,3}.){3}(\\d{1,3})(?:\\s*-\\s*)(\\d{1,3}.){3}(\\d{1,3}))";//56.1.2.3-56.1.2.5 
private static final String IP_ADDRESS_To_Numeric_RANGE = "(\\d{1,3}.){3}(\\d{1,3})(?:\\s*[T|t][O|o]\\s*)(\\d{1,3})";//56.1.2.3 to 255 
private static final String IP_ADDRESS_To_ADDRESS_RANGE = "((\\d{1,3}.){3}(\\d{1,3})(?:\\s*[T|t][O|o]\\s*)(\\d{1,3}.){3}(\\d{1,3}))";//56.1.2.3 to 56.1.3.5 

Dans le JTextField, l'utilisateur peut taper toute permutation de ceux-ci. J'ai besoin d'identifier/vérifier chaque type pour agir sur eux plus tard.

J'utilise

et appliquerai à mon JTextField avec:

setInputVerifier(); 

Questions: 1. quelqu'un peut me donner une expression régulière qui captera tous ces cas? 2. Comment faites-vous correspondre en temps réel lorsque quelqu'un tape? Peut-être attacher un TextListener au JTextField?

Je peux fournir plus de code si nécessaire.

+0

Veuillez indiquer clairement votre problème. Vous avez déjà listé les modèles regex ci-dessus, de quel autre modèle regex avez-vous besoin? Pour capturer quels cas? Et voyez http://stackoverflow.com/questions/2749521/how-to-validate-a-texttext pour la validation des données dans JTextField. –

+0

Mon problème est que j'ai plusieurs expressions rationnelles que j'essaie de faire correspondre comme indiqué ci-dessus. Dans le champ de texte, une personne peut taper l'un de ces mots comme suit: 56.1.2.3 56.1.2.4 255.255.255.254 56.1.2.7-9 56.5.1.1 à 56.5.1.7. En temps réel, je dois être en mesure de valider chaque entrée comme l'un des cas ci-dessus. Comme matcher n'utilise qu'une regex, je pense avoir besoin d'une seule regex pour regarder autour de moi pendant qu'ils tapent. –

+0

Je ne les ai jamais utilisés, mais est-ce que Tokenizer et Lexer sont la meilleure solution à ce problème ou est-ce qu'il y a quelque chose de plus facile? –

Répondre

0

Je pense que vous avez besoin d'essayer quelque chose comme ça (non testé):

private static final String IP_Address = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\d";//56.1.2.3 
private static final String IP_WithMask = "(\\d{1,3}.){3}(\\d{1,3})(?:\\s+[255])(\\d{1,3}.){3}(\\d{1,3})"; //56.1.2.3 255.255.255.254 
private static final String IP_CIDR = "(\\d{1,3}.){3}(\\d{1,3})(?:\\s*/)(\\d{1,3})"; //56.1.2.3/24 
private static final String IP_ADDRESS_Dash_Numeric_RANGE = "((\\d{1,3}.){3}(\\d{1,3})(?:\\s*-)(\\d{1,3}))";// 56.1.2.3-4 
private static final String IP_ADDRESS_Dash_ADDRESS_RANGE = "((\\d{1,3}.){3}(\\d{1,3})(?:\\s*-\\s*)(\\d{1,3}.){3}(\\d{1,3}))";//56.1.2.3-56.1.2.5 
private static final String IP_ADDRESS_To_Numeric_RANGE = "(\\d{1,3}.){3}(\\d{1,3})(?:\\s*[T|t][O|o]\\s*)(\\d{1,3})";//56.1.2.3 to 255 
private static final String IP_ADDRESS_To_ADDRESS_RANGE = "((\\d{1,3}.){3}(\\d{1,3})(?:\\s*[T|t][O|o]\\s*)(\\d{1,3}.){3}(\\d{1,3}))";//56.1.2.3 to 56.1.3.5 

private static String regex_array = IP_Address + "|" + IP_WithMask + "|" + IP_CIDR + "|" + IP_ADDRESS_Dash_Numeric_RANGE + "|" + IP_ADDRESS_Dash_ADDRESS_RANGE + "|" + IP_ADDRESS_To_Numeric_RANGE + "|" + IP_ADDRESS_To_ADDRESS_RANGE; 

public class MyInputVerifier extends InputVerifier { 
@Override 
public boolean verify(JComponent input) { 
    String text = ((JTextField) input).getText().trim(); 
    if (text.isEmpty()) return false; 
    if (text.matches(regex_array)) return false; 

    return true; 
} 
+0

Ce n'est pas tout à fait ce que j'essaie d'atteindre. Je veux vérifier le texte pendant qu'il est tapé. Au moment où le texte entré correspond à mon regex, je veux le mettre en évidence. –

0

Pour obtenir le résultat que je visais, j'ai utilisé un DocumentListener et lui a attribué à mon TextField. En utilisant la méthode insertUpdate, j'ai pu vérifier l'entrée en temps réel par rapport à une regex.

  @Override 
     public void insertUpdate(DocumentEvent e) { 
     // System.out.println("insert:" + field.getText()); 
      m = p.matcher(this.field.getText()); 
      while (m.find()) { 
       try { 
        String b = m.group(); 
        System.out.println(b); 
        int index = field.getText().indexOf(b); 
        System.out.println("index=" + index); 
        int end = index + b.length(); 
        System.out.println("end=" + end); 
        Highlighter.HighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(Valid_COLOR); 

        this.field.getHighlighter().addHighlight(index, end, painter); 

        System.out.println(">> " + b.substring(2, b.length() - 2)); 
       } catch (BadLocationException ex) { 
        System.out.println(ex); 
       } 
      } 
     }