首页 > 解决方案 > 连接多个正则表达式

问题描述

我尝试创建一个与 IPv4 匹配的正则表达式。

我有这个代码

//numbers from 10 to 99
String r10to99 = "[1-9][0-9]";

//numbers from 100 to 199
String r100to199 = "1[0-9][0-9]"; 

//numbers from 200 to 255
String r200to255 = "2[0-4][0-9]|25[0-5]"; 

//combine all - numbers from 0 to 255   
String r0to255 = "[0-9]|" + r10to99 + "|" + r100to199 + "|" + r200to255; 

String regexIP = r0to255 + "[.]" + r0to255 + "[.]" + r0to255 + "[.]" + r0to255; 

System.out.println("15.15.15.15".matches(regexIP)); //->false - should be true
System.out.println("15".matches(regexIP)); //->true - should be false

我的问题在regexIP. 它只匹配从 0 到 255 的数字。比如r0to255.

如何r0to255.(dot)它们之间连接多个?

r0to255.r0to255.r0to255.r0to255

标签: javaregex

解决方案


您需要对这些模式进行分组,请参阅固定代码:

String r10to99 = "[1-9][0-9]"; //numbers from 10 to 99
String r100to199 = "1[0-9][0-9]"; //numbers from 100 to 199
String r200to255 = "2[0-4][0-9]|25[0-5]"; //numbers from 200 to 255

//combine all - numbers from 0 to 255   
String r0to255 = "(?:[0-9]|" + r10to99 + "|" + r100to199 + "|" + r200to255 + ")"; 

String regexIP = r0to255 + "(?:[.]" + r0to255 + "){3}"; 

System.out.println("15.15.15.15".matches(regexIP)); // true
System.out.println("15".matches(regexIP)); // false

在线查看Java 演示

在这里, 将,"(?:[0-9]|" + r10to99 + "|" + r100to199 + "|" + r200to255 + ")"分组为一个更大的模式(使用非捕获组),不会破坏整个模式。r10to99r100to199r200to255|

r0to255 + "(?:[.]" + r0to255 + "){3}"模式实际上是一个r0to255模式,后面跟着三个序列.r0to255模式。


推荐阅读