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