`
marb
  • 浏览: 422469 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jakarta-ORO正则库使用

 
阅读更多

Jakarta-ORO是最全面以及优化得最好的正则表达式API之一,Jakarta-ORO库以前叫做OROMatcher,是由Daniel F. Savarese编写,后来他赠给Jakarta Project。 
    Jakarta-ORO正则表达式库支持Perl5兼容的正则表达式语法。 
    环境 jdk1.5.0_12, jakarta-oro-2.0.8 

查找: 

Java代码  收藏代码
  1. public static void simpleContains() throws Exception {  
  2.     Pattern pattern = new Perl5Compiler().compile("\\d+");  
  3.     Perl5Matcher matcher = new Perl5Matcher();  
  4.     PatternMatcherInput matcherInput = new PatternMatcherInput("北京2008年8月08日20时");  
  5.     while (matcher.contains(matcherInput, pattern)) {  
  6.         MatchResult result = matcher.getMatch();  
  7.         System.out.println(result.toString());  
  8.     }  
  9. }  


输出: 
2008 

08 
20
 

分组: 

Java代码  收藏代码
  1. public static void simpleResults() throws Exception {  
  2.     Pattern pattern = new Perl5Compiler().compile("(\\d+\\.\\d+\\.\\d+\\.\\d+)@(\\d{2}/\\d{2}/\\d{4})");  
  3.     Perl5Matcher matcher = new Perl5Matcher();  
  4.     PatternMatcherInput matcherInput = new PatternMatcherInput("202.108.9.38@08/10/2008");  
  5.     while (matcher.contains(matcherInput, pattern)) {  
  6.         MatchResult result = matcher.getMatch();  
  7.         for(int i = 0; i < result.groups(); i++) {  
  8.             System.out.printf("%s : %s\n", i, result.group(i));  
  9.         }  
  10.     }  
  11. }  


输出: 
0 : 202.108.9.38@08/10/2008 
1 : 202.108.9.38 
2 : 08/10/2008
 

拆分: 

Java代码  收藏代码
  1. public static void spiltIt() throws Exception {  
  2.     String rawStr = "北京;朝阳;鸟巢奥运会场";  
  3.     ArrayList<String> results = new ArrayList<String>();  
  4.     Perl5Matcher matcher = new Perl5Matcher();  
  5.     Pattern pattern = new Perl5Compiler().compile(";");  
  6.     Util.split(results, matcher, pattern, rawStr);  
  7.     for (String r : results) {  
  8.         System.out.println(r);  
  9.     }  
  10. }  


输出: 
北京 
朝阳 
鸟巢奥运会场
 

替换: 

Java代码  收藏代码
  1. public static void substituteIt() throws Exception {  
  2.     String rawStr = "2008-08-11 17:16:32";  
  3.     Perl5Matcher matcher = new Perl5Matcher();  
  4.     Pattern pattern = new Perl5Compiler().compile("-");  
  5.     String result = Util.substitute(matcher, pattern, new Perl5Substitution(","), rawStr, Util.SUBSTITUTE_ALL);  
  6.     System.out.println(result);  
  7. }  


输出: 
2008,08,11 17:16:32 

替换2: 

Java代码  收藏代码
  1. public static void substituteIt2() throws Exception {  
  2.     String rawStr = "2008-08-11 17:16:32";  
  3.     Perl5Matcher matcher = new Perl5Matcher();  
  4.     Pattern pattern = new Perl5Compiler().compile("(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}:\\d{2}:\\d{2})");  
  5.     String result = Util.substitute(matcher, pattern, new Perl5Substitution("变换 $3,$2,$1 $4"), rawStr, Util.SUBSTITUTE_ALL);  
  6.     System.out.println("格式yyyy-MM-dd HH:mm:ss到dd,MM,yyyy HH:mm:ss");  
  7.     System.out.println(result);  
  8. }  


输出: 
格式yyyy-MM-dd HH:mm:ss到dd,MM,yyyy HH:mm:ss 
变换 11,08,2008 17:16:32
 

小结: 
上面的几种用法看起来要比java.util.regex包用着要复杂,如果是简单应用的话还是用自带的包省力。 
下面几种用法是Perl5格式用法,如果习惯这种格式,用起来还是比较爽的。 

Perl5Util查找格式: 
[ m ] / pattern / [ i ][ m ][ s ][ x ] 
第一个m写不写都可以(The m prefix is optional) 
i  忽略大小写(case insensitive match) 
m  多行模式(treat the input as consisting of multiple lines) 
s  单行模式(treat the input as consisting of a single line) 
x  使用扩展语法 (enable extended expression syntax) 
查找  MyDoc/Java/SimpleJava  时 
正常写法  "m/MyDoc\\/Java\\/SimpleJava/" 
扩展写法  "m#MyDoc/Java/SimpleJava#x" 

Perl5Util查找: 

Java代码  收藏代码
  1. public static void perl5Match() {  
  2.     Perl5Util plUtil = new Perl5Util();  
  3.     PatternMatcherInput matcherInput = new PatternMatcherInput("北京2008年8月08日20时");  
  4.     while (plUtil.match("/\\d+/", matcherInput)) {  
  5.         MatchResult result = plUtil.getMatch();  
  6.         System.out.println(result.toString());  
  7.     }  
  8. }  


输出: 
2008 

08 
20
 

分组: 

Java代码  收藏代码
  1. public static void perl5Match2() {  
  2.     Perl5Util plUtil = new Perl5Util();  
  3.     PatternMatcherInput matcherInput = new PatternMatcherInput("202.108.9.38@08/10/2008");  
  4.     while (plUtil.match("m#08(/10/)2008#x", matcherInput)) {  
  5.         MatchResult result = plUtil.getMatch();  
  6.         System.out.printf("%s : %s\n"0, result.group(0));  
  7.         System.out.printf("%s : %s\n"1, result.group(1));  
  8.     }  
  9. }  


输出: 
0 : 08/10/2008 
1 : /10/
 

Perl5Util替换格式: 
s / pattern / replacement / [ g ][ i ][ m ][ o ][ s ][ x ] 
第一个s必须要写(The s prefix is mandatory) 
g 全部替换。默认只替换第一个 
i  忽略大小写(case insensitive match) 
m  多行模式(treat the input as consisting of multiple lines) 
o   只替换第一个(吾不确认) 
s  单行模式(treat the input as consisting of a single line) 
x  使用扩展语法 (enable extended expression syntax) 

Perl5Util替换: 

Java代码  收藏代码
  1. public static void perl5Substitute() throws Exception {  
  2.     String rawStr = "2008-08-11 17:16:32";  
  3.     Perl5Util plutil = new Perl5Util();  
  4.     String result = plutil.substitute("s/-/,/g", rawStr);  
  5.     System.out.println(result);  
  6. }  


输出: 
2008,08,11 17:16:32 

Perl5Util替换2: 

Java代码  收藏代码
  1. public static void perl5Substitute2() throws Exception {  
  2.     String rawStr = "2008-08-11 17:16:32";  
  3.     Perl5Util plutil = new Perl5Util();  
  4.     String result = plutil.substitute("s/(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}:\\d{2}:\\d{2})/变换 $3,$2,$1 $4/g", rawStr);  
  5.     System.out.println("格式yyyy-MM-dd HH:mm:ss到dd,MM,yyyy HH:mm:ss");  
  6.     System.out.println(result);  
  7. }  


输出: 
格式yyyy-MM-dd HH:mm:ss到dd,MM,yyyy HH:mm:ss 
变换 11,08,2008 17:16:32
 

Perl5Util替换3: 

Java代码  收藏代码
  1. public static void perl5AddCommas() throws Exception {  
  2.     String rawStr = "314159265";  
  3.     Perl5Util plutil = new Perl5Util();  
  4.     while(plutil.match("/[+-]?\\d*\\d{4}/", rawStr)){  
  5.         rawStr = plutil.substitute("s/([+-]?\\d*\\d)(\\d{3})/$1,$2/", rawStr);  
  6.         System.out.println(rawStr);  
  7.     }  
  8.     System.out.println(rawStr);  
  9. }  


输出: 
314159,265 
314,159,265 
314,159,265
 

过滤: 

Java代码  收藏代码
  1. public static void filter() {  
  2.     String path = "D:\\MyDoc\\Java\\SimpleJava";  
  3.     File file = new File(path);  
  4.     String[] globList = file.list(new GlobFilenameFilter("*.java"));  
  5.     for (String fn : globList) {  
  6.         System.out.println(fn);  
  7.     }  
  8.     String[] perl5List = file.list(new Perl5FilenameFilter(".+\\.java"));  
  9.     for (String fn : perl5List) {  
  10.         System.out.println(fn);  
  11.     }  
  12. }  


输出: 
DepCreater.java 
ReadAndWrite.java 
DepCreater.java 
ReadAndWrite.java
 

模式匹配的几个问题: 
表达式的递归匹配 
用正则表达式来分析一个计算式中的括号配对情况,想办法把有嵌套的的成对括号或者成对标签匹配出来。 

非贪婪匹配的效率 
当一个表达式中,有多个非贪婪匹配时,或者多个未知匹配次数的表达式时,这个表达式将可能存在效率上的陷阱。有时候,匹配速度非常慢。(简单避开方法表达式使用不超过一个非贪婪) 

参考文章: 
http://xzio.iteye.com/blog/121291

分享到:
评论

相关推荐

    Jakarta-ORO正则表达式库

    jakarta-oro.jar包供大家享用 博文链接:https://xzio.iteye.com/blog/117213

    jakarta-oro-2.0.8.rar_Perl5Util jar_jakarta-oro-2.0.8_oro

    在压缩包中的`www.pudn.com.txt`文件可能是Jakarta ORO的使用示例或者文档的一部分,可以用来了解如何在实际项目中集成和使用这个库。而`jakarta-oro-2.0.8`目录可能包含了完整的源代码、API文档和其他相关资源,如...

    commons-net-1.4.1 和 jakarta-oro-2.0.8 .rar

    压缩包中的"jakarta-oro-2.0.8.jar"是Jakarta ORO库的JAR文件,可以直接引入Java项目中使用。而"commons-net-1.4.1.zip"则是Apache Commons Net库的源代码压缩包,通常用于开发人员查看源代码、调试或自定义库的功能...

    Java正则表达式应用-Jakarta-ORO篇.doc

    Java正则表达式是Java语言中用于处理文本和模式匹配的重要工具,虽然在早期的Java版本中并未直接内置正则表达式支持,但通过引入第三方库如Jakarta-ORO,开发者可以方便地在Java应用中使用正则表达式。Jakarta-ORO是...

    FTP上传下载所需jakarta-oro-2.0.8.jar.rar

    在使用jakarta-oro-2.0.8.jar进行FTP操作时,开发者通常会集成这个库到他们的Java应用程序中,通过`java.util.jar.JarFile`类加载这个JAR文件,然后使用其中的类和方法实现正则表达式相关的功能。例如,创建一个`Oro...

    jakarta-oro.jar

    Jakarta-ORO是最全面以及优化得最好的正则表达式API之一,Jakarta-ORO库以前叫做OROMatcher,是由Daniel F. Savarese编写,后来他赠给Jakarta Project。... Jakarta-ORO正则表达式库支持Perl5兼容的正则表达式语法。

    jakarta-oro-2.0.8 java正则表达式扩展

    Jakarta ORO,全称是Oracle Regular Expressions for Java,是由Apache软件基金会开发的一个Java正则表达式库。它是对Java内置的正则表达式功能的扩展,提供了更丰富的功能和更高的性能。Jakarta ORO在Java社区中...

    jakarta-oro-2.0

    Jakarta-ORO是最全面以及优化得最好的正则表达式API之一,Jakarta-ORO库以前叫做...许多源代码开放的正则表达式库都是支持Perl5兼容的正则表达式语法,Jakarta-ORO正则表达式库也不例外,他与Perl 5正则表达式完全兼容

    jakarta-oro-2.0.8.zip

    使用Jakarta ORO时,开发者可以通过创建`Pattern`对象,预编译正则表达式,然后使用`Matcher`对象在目标字符串上执行匹配、查找、替换等操作。例如: ```java import org.apache.oro.text.regex.*; Pattern pat = ...

    apache的FTP包commons-net-1.4.1.jar,jakarta-oro-2.0.8.jar

    `jakarta-oro-2.0.8.jar`则是Jakarta ORO(Oracle Regular Expressions for Java)库,它提供了Perl 5风格的正则表达式支持。虽然在FTP操作中不是必需的,但它在处理字符串时非常有用,比如在解析FTP服务器返回的...

    jakarta-oro-2.0.8.zip_jakarta oro.jar 2.0_jakarta-oro-2_jakarta-

    Jakarta ORO,全称是Oracle Regular Expressions for Java,是一个开源项目,它为Java平台提供了强大的正则表达式处理库。Jakarta ORO是Apache软件基金会Jakarta项目的一部分,其版本号为2.0.8,这表明它是经过多次...

    jakarta-oro-2.0.1.zip_Jakarta ORO _Jakarta-O_jakarta-oro-2_jakar

    Jakarta ORO,全称是Oracle Regular Expressions for Java,是一个由Apache软件基金会开发的Java库,主要用于处理正则表达式。这个库在Java社区中广泛使用,因为它提供了比Java内置正则表达式引擎更丰富的功能和更高...

    ant-jakarta-oro-1.6.1.jar.zip

    标题中的"ant-jakarta-oro-1.6.1.jar.zip"是一个压缩文件,它包含的是Jakarta ORO库的1.6.1版本,该库是为Apache Ant项目设计的一个正则表达式处理组件。Apache Ant是一个广泛使用的Java构建工具,类似于Unix的make...

    FTPCLIENT_commons-net-1.4.1_jakarta-oro-2.0.8

    另一方面,`jakarta-oro-2.0.8.jar`是Jakarta ORO库的一个版本,它是Apache的一个正则表达式处理库。在FTP客户端应用中,虽然它不是直接用于文件传输,但可能会用于处理文件名或路径的匹配、过滤等场景。例如,你...

    ftp所需jar包(commons-net-1.4.1.jar,jakarta-oro-2.0.8.jar)

    Jakarta ORO库基于Perl5的正则表达式引擎,提供了一个高效的Java API来执行复杂的文本匹配和替换操作。 在Java中实现FTP功能,通常需要以下步骤: 1. **导入必要的库**:首先,在项目中引入这两个JAR文件,确保...

    apache-jakarta-oro.jar.zip

    Jakarta-ORO是最全面以及优化得最好的bai正则表达式API之一,duJakarta-ORO库以前叫做zhiOROMatcher,是由Daniel F. Savarese编写,后来他将其赠与daoJakarta Project。是面向JAVA的正则表达式库

    commons-net-3.3.jar、jakarta-oro-2.0.8.jar、javacsv.jar

    Jakarta ORO(ORegexp和OText)是一个正则表达式库,它为Java提供了Perl风格的正则表达式匹配和替换功能。虽然"jakarta-oro-2.0.8.jar"不是直接用于FTP连接的库,但在处理FTP服务器返回的数据,比如解析目录列表或...

Global site tag (gtag.js) - Google Analytics