接到需求大致意思是:批量查询IP地址归属地,要求给指定IP去指定网站(“中国互联网络信息中心”,网址http://www.cnnic.net.cn/)查询并获取查询结果的某几项数据。
实现过程中学到最多的就是正则表达式,本次用到的正则表达式如下:
String regwlmc = "网络名称\\:</font>\\s*</td>\\s*<[^>]+?>\\s*<[^>]+?>([^<]+?) </font>";
该段对应网站源码如下:
<table border="1" cellspacing="0" cellpadding="2">
<tr>
<td align="left" class="t_blue"><font size="2">IPv4地址段:</font></td>
<td align="left" class="t_blue"><font size="2">192.168.0.0 - 192.168.255.255 </font></td>
</tr>
<tr>
<td align="left" class="t_blue"><font size="2">网络名称:</font></td>
<td align="left" class="t_blue"><font size="2">IANA-NETBLOCK-192 </font></td>
</tr>
<tr>
<td align="left" class="t_blue"><font size="2">单位描述:</font></td>
<td align="left" class="t_blue"><font size="2">This network range is not allocated to APNIC. </font></td>
</tr>
<tr>
<td align="left" class="t_blue"><font size="2">单位描述:</font></td>
<td align="left" class="t_blue"><font size="2">descr: </font></td>
</tr>
<tr>
<td align="left" class="t_blue"><font size="2">单位描述:</font></td>
<td align="left" class="t_blue"><font size="2">This block is reserved for private internets </font></td>
</tr>
<tr>
<td align="left" class="t_blue"><font size="2">单位描述:</font></td>
<td align="left" class="t_blue"><font size="2">Please refer to RFC 1918 <http://www.ietf.org/rfc/rfc1918.txt> </font></td>
</tr>
<tr>
<td align="left" class="t_blue"><font size="2">单位描述:</font></td>
<td align="left" class="t_blue"><font size="2">for more information. </font></td>
</tr>
<tr>
<td align="left" class="t_blue"><font size="2">单位描述:</font></td>
<td align="left" class="t_blue"><font size="2">descr: </font></td>
</tr>
<tr>
<td align="left" class="t_blue"><font size="2">国家代码:</font></td>
<td align="left" class="t_blue"><font size="2">AU </font></td>
</tr>
<tr>
<td align="left" class="t_blue"><font size="2">修改记录:</font></td>
<td align="left" class="t_blue"><font size="2">hm-changed@apnic.net 20111206 </font></td>
</tr>
<tr>
<td align="left" class="t_blue"><font size="2">数据来源:</font></td>
<td align="left" class="t_blue"><font size="2">APNIC </font></td>
</tr>
<tr>
<td align="left" class="t_blue"><font size="2"></font></td>
<td align="left" class="t_blue"><font size="2"> </font></td>
</tr>
</table>
正则表达式含义是要取:
<tr>
<td align="left" class="t_blue"><font size="2">网络名称:</font></td>
<td align="left" class="t_blue"><font size="2"><span style="color:#ff0000;">IANA-NETBLOCK-192 </span></font></td>
</tr>
这一段代码中的标红部分的内容。
正则表达式分析如下:
网络名称\\:</font>\\s*</td>\\s*<[^>]+?>\\s*<[^>]+?>([^<]+?) </font>
其中正则表达式中用到的符号及含义如下:
\s 表示“空格字符(空格键, tab, 换行, 换页, 回车)”
* 表示“重复零次或更多次”
^ 表示“ 一行的开始”
? 表示“重复零次或一次”
[ ] 表示“匹配方括号内的一个字符”
将以上正则表达式翻译如下:以“网络名称:</font>”开头,中间间隔多个“空格字符(空格键, tab, 换行, 换页, 回车)”后有一个</td>标签,然后再剪个多个“空格字符(空格键, tab, 换行, 换页, 回车)”,然后中间间隔两个以“>”开头的语句后且在以“<”开头的语句之间的内容即为需要获取的信息,即“IANA-NETBLOCK-192”。