前几天就在着手写本文了。情景是这样的,一个“192.168.0.1”的 IP 地址,按照“.”标志分解成四段,考虑片刻打算以 Jakarta-ORO 实现。
但是写着写着,发现用 String.split(String arg0) 方法也可以实现需求。遂陷入了迷茫,而后转念一想,鸡肋就鸡肋吧,说不定下次会在其他地方用到。
先来看看 String.split(String arg0) 是如何实现的,下面是最想当然的写法:
public
class
SplitTest {
public
static
void
main( String[] args ){
String ip
=
"
192.168.0.1
"
;
String[] ips
=
ip.split(
"
.
"
);
System.out.println(ips.length);
}
}
嗯,测试以后,控制台打印出“0”,那这样一来 String.split(String arg0) 岂不是不能实现需求咯?且慢,我们如果加上转义符会怎样呢?
public
class
SplitTest {
public
static
void
main( String[] args ){
String ip
=
"
192.168.0.1
"
;
String[] ips
=
ip.split(
"
\\.
"
);
System.out.println(ips.length);
}
}
这次终于如愿以偿了,控制台打印出“4”。至于为什么会这样,我也没有深入探索,和朋友交流后大概是说“.”在 Java 中有特殊含义,如果要进行正则匹配,就必须转义一下。
转入 Jakarta-ORO,下面看看它是如何进行匹配的:
import
org.apache.oro.text.regex.MalformedPatternException;
import
org.apache.oro.text.regex.MatchResult;
import
org.apache.oro.text.regex.Pattern;
import
org.apache.oro.text.regex.PatternCompiler;
import
org.apache.oro.text.regex.PatternMatcher;
import
org.apache.oro.text.regex.Perl5Compiler;
import
org.apache.oro.text.regex.Perl5Matcher;
public
class
SplitTest {
public
static
void
main( String[] args )
throws
MalformedPatternException{
String ip
=
"
192.168.0.1
"
;
PatternCompiler pc
=
new
Perl5Compiler();
PatternMatcher pm
=
new
Perl5Matcher();
Pattern pattern
=
pc
.compile(
"
([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})
"
);
pm.contains(ip, pattern);
MatchResult mr
=
pm.getMatch();
int
ip0
=
Integer.parseInt(mr.group(
1
));
int
ip1
=
Integer.parseInt(mr.group(
2
));
int
ip2
=
Integer.parseInt(mr.group(
3
));
int
ip3
=
Integer.parseInt(mr.group(
4
));
System.out.println(ip0
+
"
"
+
ip1
+
"
"
+
ip2
+
"
"
+
ip3);
}
}
关于 Jakarta-ORO 更多的信息,网上一搜一大堆,在此就不进行细致的代码解释了。
请注意!引用、转贴本文应注明原作者:Rosen Jiang 以及出处:
http://www.blogjava.net/rosen