加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何使用Jakarta-ORO库

发布时间:2020-12-15 20:51:33 所属栏目:大数据 来源:网络整理
导读:简介 ? ??? Jakarta-ORO是最全面以及优化得最好的正则表达式API之一,Jakarta-ORO库以前叫做OROMatcher,是由Daniel F. Savarese编写,后来他赠给Jakarta Project。 ? ??? Jakarta-ORO正则表达式库支持Perl5兼容的正则表达式语法。 ? ??? 环境 jdk1.5.0_12,
简介

?


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

?

源码 打印 ?
  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?
8?
08?
20
?

?

源码 打印 ?
  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
?

?

源码 打印 ?
  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. }????

?

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

替换: ?

?

源码 打印 ?
  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,?new ?Perl5Substitution( "," ),?rawStr,?Util.SUBSTITUTE_ALL);????
  6. ????System.out.println(result);????
  7. }????

?

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

替换2: ?

?

源码 打印 ?
  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,?new ?Perl5Substitution( "变换?$3,$2,$1?$4" ),?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,yyyy HH:mm:ss?
变换 11,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查找: ?

?

源码 打印 ?
  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?
8?
08?
20
?

分组:

?

源码 打印 ?
  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替换: ?

源码 打印 ?
  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,11 17:16:32 ?

Perl5Util替换2: ?

源码 打印 ?
  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,$1?$4/g" ,?rawStr);????
  5. ????System.out.println("格式yyyy-MM-dd?HH:mm:ss到dd,yyyy?HH:mm:ss" );????
  6. ????System.out.println(result);????
  7. }????

输出: ?
格式yyyy-MM-dd HH:mm:ss到dd,2008 17:16:32 ?

Perl5Util替换3:

源码 打印 ?
  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
?

过滤: ?

源码 打印 ?
  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://www.oschina.net/bbs/thread/10601?lp=8 http://xzio.javaeye.com/blog/121291 http://www.zeuux.org/science/learning-regex.cn.html http://blog.csdn.net/yuanchao3333/archive/2009/01/31/3855418.aspx http://www.360doc.com/content/10/0805/09/561_43777969.shtml http://www.51testing.com/html/26/122326-215574.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读