申圣兵

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