Jakarta-ORO

 Jakarta-ORO是一个正则表达式库,它是最全面的正则表达式API之一,而且它与Perl 5和awk正则表达式完全兼容。

首先介绍使用Jakarta-ORO必须创建和访问的对象,然后介绍API。

  • PatternCompiler对象

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

PatternCompiler compiler = new Perl5Compiler();
  • Pattern对象

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

                 try {
			pattern=compiler.compile("t[ie]o",Perl5Compiler.CASE_INSENSITIVE_MASK);
			PatternMatcher matcher = new Perl5Matcher();
			System.out.println("contains:"+matcher.contains("tio00", pattern));
			System.out.println("contains:"+matcher.matchesPrefix("tio00", pattern));
			System.out.println("contains:"+matcher.matches("tio00", pattern));
		} catch (MalformedPatternException e) {
			e.printStackTrace();
		}

默认情况下,编译器创建一个大小写敏感的模式(pattern)。因此,上面代码编译得到的模式只匹配“tio”、“teo“,但不匹配“Tio”和“TiO”。要创建一个大小写不敏感的模式,你应该在调用编译器的时候指定一个额外的参数,如上面Perl5Compiler.CASE_INSENSITIVE_MASK.

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

  • PatternMatcher对象

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

PatternMatcher matcher = new Perl5Matcher();

使用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) 
PatternCompiler compiler = new Perl5Compiler();
		Pattern pattern = null;
		try {
			pattern=compiler.compile("t[ie]o",Perl5Compiler.CASE_INSENSITIVE_MASK);
			PatternMatcher matcher = new Perl5Matcher();
			PatternMatcherInput input = new PatternMatcherInput("tiotiotettio");
			while (matcher.contains(input, pattern)) {
				MatchResult result = matcher.getMatch();  
				
				//do something
				System.out.println("Match: " + result.toString());
				System.out.println("Length: " + result.length());
				int groups = result.groups();
				System.out.println("Groups: " + groups);
				System.out.println("Begin offset: " + result.beginOffset(0));
				System.out.println("End offset: " + result.endOffset(0));
				System.out.println("Saved Groups: ");

				// Start at 1 because we just printed out group 0
				for(int group = 1; group < groups; group++) {
					System.out.println(group + ": " + result.group(group));
					System.out.println("Begin: " + result.begin(group));
					System.out.println("End: " + result.end(group));
				}


			}
			//我们想从头再来搜索
			input.setCurrentOffset(input.getBeginOffset());
			
			//如果我们想使用例外一个字符串搜索,没有必要重新创建一个PatternMatcherInput对象,只要重新给input
			//传递一个新的字符串就行了
			input.setInput("anewstring");

		} catch (MalformedPatternException e) {
			e.printStackTrace();
		}

下面介绍一下oro的正则替换

PatternCompiler compiler = new Perl5Compiler();
		Pattern pattern = null;
		try {
			pattern=compiler.compile("e(0)",Perl5Compiler.CASE_INSENSITIVE_MASK);
			PatternMatcher matcher = new Perl5Matcher();
			
			String result = Util.substitute(matcher, pattern, new Perl5Substitution("dfrgrw$1"), "e0");
			System.out.println(result);
		} catch (MalformedPatternException e) {
			e.printStackTrace();
		}


e0替换成dfrgrw0

这篇文章介绍了如何在Java程序中通过Jakarta-ORO库利用正则表达式

展开阅读全文

Jakarta-ORO问题,比较奇怪

01-15

开发环境:RAD 6.0n JDK:1.3n 测试服务器:WAS 5.0测试服务器n 工程类型:web工程n n 问题过程n 1)刚开始直接把Jakarta-ORO.jar导入到lib中,使用Jakarta-ORO Util.split()提示找不到类;但是直接在调用Util的类里面加main可以正确运行;n 2)怀疑网上下载的Jakarta-ORO.jar有问题,自己重新打包,问题照旧;n 3)删除jar,将Jakarta-ORO的源代码全部导入工程,同样有问题。。。而且debug的时候不能跟进Jakarta-ORO的源代码,提示找不到源n 4)将Util.java里面的方法原封不动的复制出来。。。无论直接加到我的类,还是新建类(和调用类同一个包和不同包都测了),都没有任何问题n 5)将Util.java改名,新建一个类(在Jakarta-ORO Util原来的包下面),原封不动复制Util的代码过去,还是有问题n n 虽然可以通过复制代码出来暂时解决,但是总感觉奇怪,也想找出原因,为了这个东东测试了一天了,个人认为:n 1)RAD bug?n 2)Jakarta-ORO bug?n 3)曾经怀疑是测试服务器缓存问题。。新建不同名字的工程,复制代码过去,新建测试服务器,问题照旧!!!n n 补充一点,只有使用Util这个类报错,其他Jakarta-ORO类正常n n 确实找不出为什么了。。。请大家帮忙了,谢谢先 问题补充 在CSDN上找到一个类似的问题n http://topic.csdn.net/t/20021206/09/1236060.htmln 引用 n 在使用jakarta-oro-2.0.6的时候,编写的一个测试程序,编译的时候通过,可是运行的时候,却报   n   java.lang.NoSuchMethodError   n     n   程序代码如下:(部分主要的)   n     n   public   static   void   main(String[]   args)   n           try   n                   String   link="   dsfasdfsda";   n                   String   regexForLink="\\[IMG\\](.[^\\[]*)\\[\\/IMG\\]";   n                   PatternCompiler   compiler   =   new   Perl5Compiler();   n                   Pattern   patternForLink=compiler.compile(regexForLink,Perl5Compiler.CASE_INSENSITIVE_MASK);   n                   PatternMatcher   matcher   =   new   Perl5Matcher();   n     n                   StringBuffer   sb   =   new   StringBuffer();   n                   int   i   =   Util.substitute(sb,   matcher,patternForLink,   n                                   new   Perl5Substitution("$1"),   n                                   link,   n                                   Util.SUBSTITUTE_ALL);   n                   System.out.println("   resultstr   =   "+sb.toString());           n           catch(Exception   e)   n                   e.printStackTrace();   n              n      n     n   ----------------------   n           错误定位在int   i   =   Util.substitute(···)这一行。可是很奇怪的时候,编译的时候可以编译过去。运行的时候,再报告java.lang.NoSuchMethodError。   n           请问谁有解决办法?n 问题补充 Jakarta-ORO 2.08的 问题补充: 不仅是编译可以通过,在类里面加main测试都是正常的n n ClassPAth就更没有问题,我从来不会把jar丢classpath的 问题补充: 在wen环境中运行n 无论测试环境还是部署后n n 问题补充: 有的时候有些开发工具可能因为缓存等因素造成不能正确发布,故而测试了下载正式的环境,问题依旧 问题补充: 都不可以。。。n n 为了排除包的问题,我已经把包都删除了。。。我把oro的jar都删除了,直接从apache上down的源码丢工程里面的,运行的时候使用Java Applicaiotn测试都没有问题;如果在web环境运行都不可以,无论是RAD带的WAS5的测试环境还是在其他服务器上单独安装的WAS。。。而且调试的时候提示没有源代码!!! 问题补充: 谢谢大家了r r 是WAS里面有一个包里面打包了低版本的ORO的原因(IBM把别人的包直接丢自己包里面去了算不算违反license啊???!!!)r r 问题解决方法也很多:r 1)Put jakarta-oro-2.0.8.jar "in front" in the classloader hierarchy: WebSphereConsole-> server -> Process Definitions -> JVM -> set classpath = path_including_jakarta-oro-2.0.8.jar r ==因为这边部署环境比较复杂,在有全国各地哦系统跑,不到万不得已不采用这种方式r 2)修改Web的类引导优先级:同样修改WAS部署参数。。。暂时不考虑r 3)最好被迫使用。。。。自己新建一个类,把两个版本ORO的差异的东西加进去。。。r r r 其实大家都帮我解决问题可,不过答案好像只能给一个人。。。。其他的朋友就有点对不住了哈,分给第一个了r r 问答

没有更多推荐了,返回首页