Java 实时验证JTextField的输入

Java 实时验证JTextField的输入,java,regex,ip,cidr,Java,Regex,Ip,Cidr,我有一张申请防火墙访问的表格JTable。对于用户要在其中输入源的JTextField,我希望在用户键入时实时验证输入。有效输入将以绿色突出显示。不允许使用无效的 以下正则表达式是有效的输入: 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}.)

我有一张申请防火墙访问的表格JTable。对于用户要在其中输入源的JTextField,我希望在用户键入时实时验证输入。有效输入将以绿色突出显示。不允许使用无效的

以下正则表达式是有效的输入:

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
在JTextField中,用户可以键入这些内容的任何排列。我需要识别/验证每种类型,以便稍后对其采取行动

我正在使用

public class MyVerifyer extends InputVerifier{}
并将其应用于我的JTextfield,包括:

setInputVerifier();
问题: 1.有人能给我一个正则表达式来记录所有这些案例吗? 2.当有人打字时,如何实时匹配。也许将TextListener附加到JTextField


如果需要,我可以提供更多的代码

我认为您需要尝试这样未经测试的东西:

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;
}

为了实现我想要的结果,我使用了DocumentListener并将其分配给我的文本字段。利用insertUpdate方法,我能够根据正则表达式实时验证输入

            @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);
                }
            }
        }

请把你的问题说清楚。您已经列出了上面的正则表达式模式,您需要什么其他正则表达式模式?捕捉哪些案例?请参阅JTextField中的数据验证。我的问题是,如上所述,我有多个试图匹配的正则表达式。在文本字段中,用户可以键入以下任意内容: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。在实时情况下,我需要能够验证上述情况之一的每个输入。由于matcher只使用一个正则表达式,我想我需要一个正则表达式,以便在他们键入时四处查看。我从未使用过它们,但标记器和Lexer是解决此问题的最佳解决方案还是有更简单的方法?我只能建议将这些模式与|结合起来,然后用它来验证你的任何输入。这不是我想要实现的。我想在键入文本时验证文本。当输入的文本与我的正则表达式匹配时,我想突出显示它。