正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
元字符
由于 \ 和 " 或者 ’ 组合无法显示出来,所以下面的内容尽可能的加了一个空格。还有 | 这个字符也是无法显示出来,用 l 代替了。
字符 | 描述 |
---|---|
\ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,‘n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 ’ \ \ ’ 匹配 " \ " 而 “\ (” 则匹配 " ("。 |
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
. | 匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像"(.I\n)"的模式。 |
(pattern) | 匹配 pattern 并获取这一匹配 。 |
xly | 匹配 x 或 y。例如,‘zlfood’ 能匹配 “z” 或 “food”。’(zlf)ood’ 则匹配 “zood” 或 “food”。 |
[xyz] | 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。 |
[a-z] | 字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
当然不止上面那么少的元字符,只列出来用到的,还有很多元字符,包括普通字符、非打印字符、特殊字符、限定符、定位符等。如果想要了解更多关于这方面的知识,可以点这里。正则表达式 - 教程
JAVA IP地址格式验证
首先需要了解IP地址的数字范围:
- A类IP地址是指, 在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。
A类IP地址范围:1.0.0.1-126.255.255.254
- B类IP地址是指,在IP地址的四段号码中,前两段号码为网络号码。
B类IP地址范围:128.1.0.1-191.254.255.254
- C类IP地址是指,在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。
C类IP地址范围:192.0.1.1-223.255.254.254
- D类IP地址在历史上被叫做多播地址(multicast address),即组播地址。在以太网中,多播地址命名了一组应该在这个网络中应用接收到一个分组的站点。
D类IP地址范围:224.0.0.1-239.255.255.255
特殊的网址:
- 每一个字节都为0的地址(“0.0.0.0”)对应于当前主机
- IP地址中的每一个字节都为1的IP地址(“255.255.255.255”)是当前子网的广播地址
- IP地址中凡是以“11110”开头的E类IP地址都保留用于将来和实验使用
- IP地址中不能以十进制“127”作为开头,该类地址中数字127.0.0.1到127.255.255.255用于回路测试,如:127.0.0.1可以代表本机IP地址,用“http://127.0.0.1”就可以测试本机中配置的Web服务器
- 网络ID的第一个6位组也不能全置为“0”,全“0”表示本地网络
好了,入正题。根据上面所列出来的IP地址范围,去掉0.0.0.0这个特殊的主机地址,然后就可以确定第1段地址数值范围1-255,第2、3、4段地址数值范围0-255。
- 将第1段分成5部分:1 - 9 ,10 - 99, 100 - 199, 200 - 249, 250 - 255。
数值范围 | 正则表达式 |
---|---|
1-9 | [1-9] |
10-99 | [1-9]\d |
100-199 | 1\d{2} |
200-249 | 2[0-4]\d |
250-255 | 25[0-5] |
So,将上面的正则表达式用 | 连起来就是第1段地址的正则表达式:
([1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])
- 第2、3、4段地址拆分其实跟第1段差不多,有两个不同的地方:①数值可以为0;②将"."放到第2、3、4段地址前面。
数值范围 | 正则表达 |
---|---|
0-9 | \d |
10-99 | [1-9]\d |
100-199 | 1\d{2} |
200-249 | 2[0-4]\d |
250-255 | 25[0-5] |
还有".“的正则表达式:”\."
So,将上面的正则表达式用 | 连起来就是第2、3、4段地址的正则表达式:
(\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]))
由于第2、3、4段地址数值范围是一样的,所以正则表达式为:
(\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3}
Just do it!将上面第1段和2、3、4段正则表达式连起来就是IP地址的正则表达式了:
^([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])){3}$
以"^“开始,以”$"结束。
JAVA代码实现:
public static boolean isValidIPAddress(String ipAddress) {
if ((ipAddress != null) && (!ipAddress.isEmpty())) {
return Pattern.matches("^([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])){3}$", ipAddress);
}
return false;
}