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庫利用正則表達式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章