oro java_apache的Jakarta-ORO分解IP地址及使用

Jakarta-ORO是最全面以及优化得最好的正则表达式API之一,Jakarta-ORO正则表达式库支持Perl5兼容的正则表达式语法。 当前版本是2.0.8 ,支持 Perl 5.003的正则表达式 jakarta-oro-2.0.8.jar 的下载地址:jakarta-oro-2.0.8.zip

要把ip地址如:192.168.1.100分解成数组,有简单方式和复杂方式,简单方式可以使用 String.split(String arg0);

先来看看 String.split(String arg0) 是如何实现的:

public class IpSplitTest {

public static void main( String[] args ){

String ipAddress = "192.168.0.1";

//注意这里,.需要转义

String[] ipArr = ipAddress.split("\\.");

System.out.println(ipArr.length);

}

}

使用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 IpSplitTest {

public static void main( String[] args ) {

String ipAddress = "192.168.1.100";

PatternCompiler patternCompiler = new Perl5Compiler();

PatternMatcher patternMatcher = new Perl5Matcher();

Pattern pattern = patternCompiler

.compile("([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})");

patternMatcher.contains(ipAddress, pattern);

MatchResult matchResult = patternMatcher.getMatch();

int ip0 = Integer.parseInt(matchResult.group(1));

int ip1 = Integer.parseInt(matchResult.group(2));

int ip2 = Integer.parseInt(matchResult.group(3));

int ip3 = Integer.parseInt(matchResult.group(4));

System.out.println(ip0+" "+ip1+" "+ip2+" "+ip3);

} catch (Exception ex) {

ex.printStackTrace();

}

}

}

Jakarta-ORO库

有许多源代码开放的正则表达式库可供Java程序员使用,而且它们中的许多支持Perl 5兼容的正则表达式语法。我在这里选用的是Jakarta-ORO正则表达式库,它是最全面的正则表达式API之一,而且它与Perl 5正则表达式完全兼容。另外,它也是优化得最好的API之一。

Jakarta-ORO库以前叫做OROMatcher,Daniel Savarese大方地把它赠送给了Jakarta Project。你可以按照本文最后参考资源的说明下载它。

我首先将简要介绍使用Jakarta-ORO库时你必须创建和访问的对象,然后介绍如何使用Jakarta-ORO API。

PatternCompiler对象

首先,创建一个Perl5Compiler类的实例,并把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个实现,允许你把正则表达式编译成用来匹配的Pattern对象。

Pattern对象

要把正则表达式编译成Pattern对象,调用compiler对象的compile()方法,并在调用参数中指定正则表达式。例如,你可以按照下面这种方式编译正则表达式“t[aeio]n”:

默认情况下,编译器创建一个大小写敏感的模式(pattern)。因此,上面代码编译得到的模式只匹配“tin”、“tan”、 “ten”和“ton”,但不匹配“Tin”和“taN”。要创建一个大小写不敏感的模式,你应该在调用编译器的时候指定一个额外的参数:

创建好Pattern对象之后,你就可以通过PatternMatcher类用该Pattern对象进行模式匹配。

PatternMatcher对象

PatternMatcher对象根据Pattern对象和字符串进行匹配检查。你要实例化一个Perl5Matcher类并把结果赋值给PatternMatcher接口。Perl5Matcher类是PatternMatcher接口的一个实现,它根据Perl 5正则表达式语法进行模式匹配:

使用PatternMatcher对象,你可以用多个方法进行匹配操作,这些方法的第一个参数都是需要根据正则表达式进行匹配的字符串:

boolean matches(String input, Pattern pattern):当输入字符串和正则表达式要精确匹配时使用。换句话说,正则表达式必须完整地描述输入字符串。

boolean matchesPrefix(String input, Pattern pattern):当正则表达式匹配输入字符串起始部分时使用。

boolean contains(String input, Pattern pattern):当正则表达式要匹配输入字符串的一部分时使用(即,它必须是一个子串)。

另外,在上面三个方法调用中,你还可以用PatternMatcherInput对象作为参数替代String对象;这时,你可以从字符串中最后一次匹配的位置开始继续进行匹配。当字符串可能有多个子串匹配给定的正则表达式时,用PatternMatcherInput对象作为参数就很有用了。用PatternMatcherInput对象作为参数替代String时,上述三个方法的语法如下:

boolean matches(PatternMatcherInput input, Pattern pattern)

boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)

boolean contains(PatternMatcherInput input, Pattern pattern)

Jakarta-ORO的使用实例,查找数字:

public static void simpleContains() throws Exception {

Pattern pattern = new Perl5Compiler().compile("\\d+");

Perl5Matcher matcher = new Perl5Matcher();

PatternMatcherInput matcherInput =

new PatternMatcherInput("现在时间是2013年7月20日");

while (matcher.contains(matcherInput, pattern)) {

MatchResult matchResult = matcher.getMatch();

System.out.println(matchResult.toString());

}

}

Jakarta-ORO的使用实例,查找指定后缀文件名的文件名称:

public static void fileSuffixFind() {

String filePath = "F:\\project\\jdk\\src";

String patternStr="*.java";

File file = new File(filePath);

String[] globList = file.list(new GlobFilenameFilter(patternStr));

for (String fn : globList) {

System.out.println("1:"+fn);

}

patternStr=".+\\.java";

String[] perl5List = file.list(new Perl5FilenameFilter(patternStr));

for (String fn : perl5List) {

System.out.println("2:"+fn);

}

}

//输出

1:A.java

1:BaseForm.java

1:BaseObject.java

2:A.java

2:BaseForm.java

2:BaseObject.java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值