我需要正则表达式使用端口检测所有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");
}
答案 0 :(得分:4)
没有对可以以结构化方式处理IP地址的更适合的Java类做出声明......
您可以使用否定预测向正则表达式添加例外:
String numIPRegex = "(?!(?:93\\.153\\.31\\.151|10\\.0\\.0\\.1)(?::27002)?)\\d{1,3}(?:\\.\\d{1,3}){3}(?::\\d{1,5})?";
说明:
(?! # start negative look-ahead (?: # start non-capturing group 93\.153\.31\.151 # exception address #1 | # or 10\.0\.0\.1 # exception address #2 ) # end non-capturing group (?: # start non-capturing group :27002 # port number )? # end non-capturing group; optional ) # end negative look-ahead \d{1,3}(?:\.\d{1,3}){3}(?::\d{1,5})? # your original expression
当然,另一个明显的替代方案是逐个前置地测试异常,如果一个例外匹配则返回false。将它们全部包装在一个大的正则表达式中很快就会变得非常难看。
答案 1 :(得分: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;
}