public static boolean isIpv4(String ipAddress) {
String ip = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
Pattern pattern = Pattern.compile(ip);
Matcher matcher = pattern.matcher(ipAddress);
return matcher.matches();
}
这里用到java中正则表达式:
^表示匹配的一行的开头,$表示匹配一行的结束,|
表示逻辑或的意思(或者)
1\\d{2}:判断是1开头的三位数,也就是从100-199.
2[0-4]\\d:判断是三位数,中间那个数在0,1,2,3,4这几个数中选择,也就是数据范围在如下的范围:200-209,210-219,220-229,230-239,240-249
25[0-5]:250-255
[1-9]\\d:10-19,20-29,30-39,40-49,50-59,60-69,70-79,80-89,90-99
[1-9]:1-9
\\.:表示IP地址分隔符
其他的类似可知。
Pattern pattern =
Pattern.compile(ip);(1)Matcher matcher
= pattern.matcher(ipAddress);(2)
若想要将正则表达式视为一个对象来重复使用,就可以使用Pattern的静态方法compile()进行编译。compile()方法会返回一个Pattern实例。这个实例代表正则表达式,以后就可以重复使用这个Pattern实例的matcher()方法来返回一个Matcher实例,该实例代表符合正则式的实例。
下面是代码的实现:
package second;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaString4 {
public static void main(String[] args) {
String handset =
"192.168.1.1";
String regex =
"^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
//String regex = "^([1-9] |
[1-9]\\d | 1\\d{2} | 2[0-4]\\d | 25[0-5])\\."
// +"(\\d
| [1-9]\\d | 1\\d{2} | 2[0-4]\\d | 25[0-5])\\."
// +"(\\d
| [1-9]\\d | 1\\d{2} | 2[0-4]\\d | 25[0-5])\\."
// +"(\\d
| [1-9]\\d | 1\\d{2} | 2[0-4]\\d | 25[0-5])$";
Pattern pattern =
Pattern.compile(regex);
Matcher matcher =
pattern.matcher(handset);
if(matcher.find()){ //find()方法捕获状态,对于相应的对象值,我们必须调用方法函数才能获得
System.out.println(handset
+"\n是一个合法的IP地址!");
}
else{
System.out.println(handset
+"\n是一个不合法的IP地址!");
}
// TODO 自动生成的方法存根
}
}
成功实现:
在编程的过程中我遇到一个疑问如下:
package second;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaString4 {
public static void main(String[] args) {
String handset = "192.168.1.1";
代码1:
String regex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+ "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
代码2:
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(handset);
if (matcher.find()) {
System.out.println(handset + "\n是一个合法的IP地址!");
} else {
System.out.println(handset + "\n是一个不合法的IP地址!");
}
// TODO 自动生成的方法存根
}
}
这里我想问问我用双斜杠注释掉的代码2和前面的代码1, 有什么本质区别的吗?
代码1我加上程序是成功的,但是我实在不明白代码2为什么就无法实现,总是显示:
192.168.1.1
是一个不合法的IP地址!
后来我在网上求助,万能的网友帮我解决了:
String regex =
"^([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\."
+"(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\."
+"(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\."
+"(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])$";
把里面的空格去掉,你的表达式中有空格,所以不匹配。
后来我根据这个帮助,我修改之后果然调试成功了。
正则表达式编写的时候:不能有空格存在