在上一篇中,我們定義了從公共參數池來讀取數據,也定義了以${param_name}的形式來讀取公共參數池中的參數。那么如何實現這個讀取呢?我們可以通過正則表達式來實現。
PS:對正則表達式非常熟悉的童鞋可以略過本篇。
關於正則表達式來解析,我們首先來看一下,Java中有關正則表達式的類Pattern。
聲明:下面的內容中,有的是引用網上的內容,具體來源記不清了,如有雷同,純屬巧合。
先上一小段代碼:
String regex = "\\?|\\*"; Pattern pattern = Pattern.compile(regex); String patternStr = pattern.pattern(); //----> 返回 \?\*
在這里解釋一下,String regex的賦值:"\\?|\\*";
第一個“\ ”是轉義符,用來轉義后面的"\"
中間的“|”是分隔符,意味着后面如果再有“\”,也需要進行轉義。
返回值是\?\* ------>也就是說我們可以用這個字符串來進行正則的匹配
Pattern類用於創建一個正則表達式,也可以說創建一個匹配模式,它的構造方法是私有的,不可以直接創建,但可以通過Pattern.complie(String regex)簡單工廠方法創建一個正則表達式。
通過閱讀JavaAPI的文檔,我們可以整理出以下訊息:

1.Pattern.split(CharSequence input)
Pattern有一個split(CharSequence input)方法,用於分隔字符串,並返回一個String[],我猜String.split(String regex)就是通過Pattern.split(CharSequence input)來實現的.
Java代碼示例:
Pattern p=Pattern.compile("\\d+");
String[] str=p.split("我的QQ是:456456我的電話是:0532214我的郵箱是:aaa@aaa.com");
Patternsplit(str),返回的是一個字符串數組。之前定義的正則是“\\d”,字符串字面是\d,預定義是0-9的數字,也就是說遇到數字來匹配。
結果:str[0]="我的QQ是:" str[1]="我的電話是:" str[2]="我的郵箱是:aaa@aaa.com"
2.Pattern.matcher(CharSequence input) 對指定輸入的字符串創建一個Matcher對象
可以先看一段代碼:
Pattern pattern = Pattern.compile("\\?{2}"); Matcher matcher = pattern.matcher("??"); boolean matches = matcher.matches();// ---->true
按照之前的理解:
第一句:第一個“\”是轉義符,那么實際的Pattern字符串應該是“\?{2}”
第二句:對指定的字符串“??”創建一個matcher的對象。
第三句:對matcher的對象,使用matches()方法,可以匹配到?,所以返回就是true了。
下面這些例子可以說明一些問題:
Pattern.matches("\\d+","2223");//返回true Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,這里aa不能匹配到 Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,這里bb不能匹配到 Pattern p=Pattern.compile("\\d+"); Matcher m=p.matcher("22bb23"); m.pattern();//返回p 也就是返回該Matcher對象是由哪個Pattern對象的創建的
3.Matcher.matches()/ Matcher.lookingAt()/ Matcher.find()
Matcher類提供三個匹配操作方法,三個方法均返回boolean類型,當匹配到時返回true,沒匹配到則返回false
.matches() ---->全匹配
Pattern p = Pattern.compile("\\d+"); Matcher m = p.matcher("22bb23"); m.matches();//返回false,因為bb不能被\d+匹配,導致整個字符串匹配未成功. Matcher m2 = p.matcher("2223"); m2.matches();//返回true,因為\d+匹配到了整個字符串
.lookingAt() ------>從頭開始匹配
Pattern p = Pattern.compile("\\d+"); Matcher m = p.matcher("22bb23"); m.lookingAt();//返回true,因為\d+匹配到了前面的22 Matcher m2 = p.matcher("aa2223"); m2.lookingAt();//返回false,因為\d+不能匹配前面的aa
.find() ------> 任意位置匹配
Pattern p = Pattern.compile("\\d+"); Matcher m = p.matcher("22bb23"); m.find();//返回true Matcher m2 = p.matcher("aa2223"); m2.find();//返回true Matcher m3 = p.matcher("aa2223bb"); m3.find();//返回true Matcher m4 = p.matcher("aabb"); m4.find();//返回false
4.Mathcer.start()/ Matcher.end()/ Matcher.group()
start()返回匹配到的子字符串在字符串中的索引位置.
end()返回匹配到的子字符串的最后一個字符在字符串中的索引位置.
group()返回匹配到的子字符串
Pattern p = Pattern.compile("\\d+"); Matcher m = p.matcher("aaa2223bb"); m.find();//匹配2223 m.start();//返回3 ---->索引序列是(0,1,2,3,4.......),也就是匹配到的2223在aaa2223bb中的位置 m.end();//返回7,返回的是2223后的索引號 ---->索引序列是(0,1,2,3,4.......),也就是匹配到的2223之后的那個索引位置 m.group();//返回2223 ---->返回匹配到的2233 Matcher m2 = m.matcher("2223bb"); m2.lookingAt(); //匹配2223 m2.start(); //返回0,索引序列是0 m2.end(); //返回4返回的是2223后的索引號 m2.group(); //返回2223 Matcher m3 = p.matcher("2223bb"); m3.matches(); //返回false,因為需要匹配整個字符串
start(),end(),group()均有一個重載方法它們是start(int i),end(int i),group(int i)專用於分組操作,Mathcer類還有一個groupCount()用於返回有多少組.
Java代碼示例:
Pattern p = Pattern.compile("([a-z]+)(\\d+)");//匹配a-z的小寫字母及0-9的數字 Matcher m = p.matcher("aaa2223bb"); m.find(); //返回true,匹配aaa2223 m.groupCount(); //返回2,因為有2組 m.start(1); //返回0 返回第一組匹配到的子字符串在字符串中的索引號 m.start(2); //返回3 m.end(1); //返回3 返回第一組匹配到的子字符串的最后一個字符在字符串中的索引位置. m.end(2); //返回7 m.group(1); //返回aaa,返回第一組匹配到的子字符串 m.group(2); //返回2223,返回第二組匹配到的子字符串
在弄清楚上面的正則表達式類,及相關的方法后,我們可以來整理一下我們參數的使用方法。