1

我需要正则表达式来检测所有带端口和不带端口的 IP,但除外

93.153.31.151(:27002)

10.0.0.1(:27002)

我有一些,但我需要添加例外

\\d{1,3}(?:\\.\\d{1,3}){3}(?::\\d{1,5})?

对于java匹配器

    String numIPRegex = "\\d{1,3}(?:\\.\\d{1,3}){3}(?::\\d{1,5})?";

    if (pA.matcher(msgText).find()) {
        this.logger.info("Found");

    } else {    
        this.logger.info("Not Found");                  

    }
4

2 回答 2

4

没有说明可以以结构化方式处理 IP 地址的更适合的 Java 类......

您可以使用负前瞻向正则表达式添加异常:

String numIPRegex = "(?!(?:93\\.153\\.31\\.151|10\\.0\\.0\\.1)(?::27002)?)\\d{1,3}(?:\\.\\d{1,3}){3}(?::\\d{1,5})?";

解释:

(?! # 开始负前瞻
  (?: # 启动非捕获组
    93\.153\.31\.151 #异常地址#1
    | # 或者
    10\.0\.0\.1 #异常地址#2
  ) # 结束非捕获组
  (?: # 启动非捕获组
    :27002 # 端口号
  )? # 结束非捕获组;选修的
) # 结束负前瞻
\d{1,3}(?:\.\d{1,3}){3}(?::\d{1,5})? # 你原来的表达方式

当然,另一种明显的选择是预先一个一个地测试异常,如果一个异常匹配则返回 false。将它们全部包装在一个大的正则表达式中将很快变得非常难看。

于 2013-01-06T13:37:27.697 回答
0

你要这个?

public static void main(String[] args) {
    System.out.println(match("93.153.31.151(:27002)")); // false
    System.out.println(match("12.23.34.45(:21002)")); // true
}
public static boolean match(String input) {
    String exclude = "|93.153.31.151(:27002)|10.0.0.1(:27002)|";
    if (exclude.contains("|" + input + "|")) return false; // Exclude from match
    //
    String numIPRegex = "^\\d{1,3}(\\.\\d{1,3}){3}\\(:\\d{1,5}\\)$";
    Pattern pA = Pattern.compile(numIPRegex);
    //
    if (pA.matcher(input).matches()) {
        System.out.println("Found");
        return true;
    } else {    
        System.out.println("Not Found");                  
    }
    return false;
}
于 2013-01-06T13:56:52.787 回答