申圣兵
現(xiàn)在流行的校園類App如超級(jí)課程表、課程格子等都是以學(xué)生熟悉的課程表作為應(yīng)用的切入點(diǎn),受到了他們的喜愛(ài)。有些應(yīng)用包含上千所學(xué)校的課表信息,這些學(xué)校的課表信息千差萬(wàn)別,正則表達(dá)式成了一個(gè)識(shí)別和解析它們的有力工具。
課表的信息來(lái)源一般是正方、青果等教務(wù)管理系統(tǒng),它們一般都是以網(wǎng)頁(yè)形式顯示的,其中典型的網(wǎng)頁(yè)課表源碼格式如下:
計(jì)算機(jī)網(wǎng)絡(luò)(A)
周二第1,2節(jié){第315周|單周}
馮海林(馮海林)
教1609(多媒體)
它們一般包括課程名、星期、節(jié)次、周數(shù)、教師、教室等信息,相關(guān)類別信息以HTML標(biāo)記
分隔,很容易使用JSoup等工具解析出來(lái),比較復(fù)雜的地方主要是星期、節(jié)次等信息,它們往往是連在一起的,不容易分離,并且格式多樣,因此,使用正則表達(dá)式解析這一部分內(nèi)容成了課表解析的一個(gè)關(guān)鍵。
1 課表節(jié)次的一般格式
下面是一些常見(jiàn)的課表節(jié)次信息格式:
(1)周二第1,2節(jié){第416周}二,1,2,4,16,null
(2){第210周|3節(jié)/周}null,null,null,2,10,3節(jié)/周
(3)周二第1,2節(jié){第416周|雙周}二,1,2,4,16,雙周
(4)周二第1節(jié){第416周}二,1,null,4,16,null
(5)周二第1節(jié){第416周|雙周}二,1,null,4,16,雙周
這些包括了常見(jiàn)的課表節(jié)次格式,如果和以上的格式不符,那么就要自行修改正則表達(dá)式。
2 正則表達(dá)式的使用方法
現(xiàn)在以Java語(yǔ)言為例介紹正則表達(dá)式在高級(jí)語(yǔ)言中的使用方法。Java從JDK 1.40版本開(kāi)始包含了java.util.regex包,這個(gè)包中包括了兩個(gè)類:Pattern(模式類)和Matcher(匹配器類),一個(gè)Pattern對(duì)象就是一個(gè)正則表達(dá)式經(jīng)編譯后的表現(xiàn)模式,也就是前邊所說(shuō)的“模式編譯器”;一個(gè)Matcher對(duì)象是一個(gè)狀態(tài)機(jī)器,它根據(jù)Pattern對(duì)象作為匹配模式對(duì)字符串展開(kāi)匹配檢查,也就是“模式匹配器”。這里主要使用了Pattern類的compile方法及Matcher類的matches方法。它們的作用如下:
(1)compile(String regex)方法:將指定的正則表達(dá)式進(jìn)行編譯。
(2)matches()方法:判斷整個(gè)字符序列與模式是否匹配。如果連續(xù)用Matcher對(duì)象檢查多個(gè)字符串,可以使用reset方法重置匹配器,放棄其所有顯式狀態(tài)信息并將其添加位置設(shè)置為零。
課表正則表達(dá)式中使用了組,組在正則表達(dá)式中是一個(gè)非常重要的概念。組是用括號(hào)來(lái)劃分正則表達(dá)式的,可以通過(guò)編號(hào)來(lái)引用組。組號(hào)從0開(kāi)始,有幾對(duì)小括號(hào)就表示有幾個(gè)組,并且組可以嵌套,組號(hào)為0的表示整個(gè)表達(dá)式,組號(hào)為1的表示第一個(gè)組,依此類推。例如:A((B)C)(D)E正則式中有四組:組0是ABCDE,組1是BC,組2是B;組3是C,組4是D。
3 正則表達(dá)式在提取課表信息中的應(yīng)用
下面我們以提取課程節(jié)次信息為例,看看正則表達(dá)式的靈活應(yīng)用。
節(jié)次信息的正則表達(dá)式可寫成:String reg = “周(.)第(\\d{1,2}),(\\d{1,2})節(jié)\\{第(\\d{1,2})(\\d{1,2})周\\|((.*周))\\}”;
String splitPattern = “
”;//設(shè)置課表分隔標(biāo)記
String[] temp = sub.split(splitPattern);//將課表信息分離,存在字符串?dāng)?shù)組中,數(shù)組第二個(gè)為節(jié)次信息
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(temp[1]);
matcher.matches();
最終得到的課表格式如下圖如示:
4 結(jié)語(yǔ)
現(xiàn)在流行的開(kāi)發(fā)語(yǔ)言比如C#、VB、Java等等都提供了對(duì)正則表達(dá)式的直接支持,在很多領(lǐng)域得到了應(yīng)用,由于正則表達(dá)式相對(duì)比較抽象,不容易理解,要精通它比較困難,但熟悉一些常用操作,對(duì)我們的工作還是有很大的幫助的。
參考文獻(xiàn):
[1]胡軍偉.正則表達(dá)式在Web信息抽取中的應(yīng)用.北京信息科技大學(xué)學(xué)報(bào),2011.
[2]張靜.正則表達(dá)式及其在信息抽取中的應(yīng)用.電腦知識(shí)與技術(shù),2009.
[3]唐惠麗.正則表達(dá)式的研究及在Web中的應(yīng)用.計(jì)算機(jī)技術(shù)與發(fā)展,2013.