在上一篇中,我們定義了從公共參數池來讀取資料,也定義了以${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我的郵箱是:[email protected]");
Patternsplit(str),傳回的是一個字元串數組。之前定義的正則是“\\d”,字元串字面是\d,預定義是0-9的數字,也就是說遇到數字來比對。
結果:str[0]="我的QQ是:" str[1]="我的電話是:" str[2]="我的郵箱是:[email protected]"
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,傳回第二組比對到的子字元串
在弄清楚上面的正規表達式類,及相關的方法後,我們可以來整理一下我們參數的使用方法。