java - 实时验证 JTextField 的输入

标签 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}.){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;
}

关于java - 实时验证 JTextField 的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28866385/

相关文章:

python - 提高 C++ 正则表达式替换性能

c# - Javascript RegEx 不会工作,但在 c# 中工作(原子子表达式)

python - ASCII IP 到主机字节顺序长

c# - IP 地址验证

java - 如何使用 Selenium/Webdriver 自动化聊天应用程序?

java - Xtext中如何从INode获取资源?

java - 正则表达式来查看字符串是否包含模式

java - 如何编写代码来通知 XML 文件更改?

java - 如何为 RabbitMQ DefaultConsumer 设置超时?

java - FFmpegFrameGrabber 仅使用关键帧更快的 SetTimestamp