正則表達式往往是網(wǎng)頁信息提取的主要技術(shù)工具,但是網(wǎng)頁信息提取工具包MetaSeeker的客戶端軟件DataScraper并沒有采用該技術(shù),而是采用DOM+XPath+XSLT。但是提取到的結(jié)果被集成到數(shù)據(jù)庫或其他Web應用之前,可以采用正則表達式對提取結(jié)果進行二次過濾。例如,MettaSeeker工具包中的結(jié)構(gòu)化數(shù)據(jù)對象搜索引擎SliceSearch和通用文本分類訓練集管理器MetaCorpora都采用了正則表達式對特定字段進行過濾處理。
正則表達式的句法是比較不好掌握,下面是從網(wǎng)絡上搜集的多個正則表達式的典型用例(use case),可以根據(jù)自己的需要,套用這些樣例即可。當然要讀懂這寫典型用例,需要基本的正則表達式句法知識,可以閱讀文后的參考資料。
查詢
代碼片段:
String str = "abc efg ABC"; String regEx = "a|f"; //表示a或f Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); boolean rs = m.find();
利用find()方法,如果str中有regEx,那么rs為true,否則為false。如果想在查找時忽略大小寫,則可以寫成
Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
上述片斷只調(diào)用了一次m.find(),只匹配一次,如果要將輸入字串中的所有匹配到的子串都匹配出來,應該將find()放在while循環(huán)中
提取
代碼片段:
String regEx = ".+\(.+)$"; String str = "c:\dir1\dir2\name.txt"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); boolean rs = m.find(); for(int i = 1; i <= m.groupCount(); i++){ System.out.println(m.group(i)); }
利用find()方法,從字符串中提取出name.txt,提取的字符串儲存在m.group(i)中,m.groupCount()表示提取到的字符串分組的數(shù)量
分組m.group(0)表示匹配到的完整子字串,m.group(n) n = 1, 2, ... 是匹配到的子字串中的各個組,而m.groupCount()是不包括group(0)的,也就是如果m.group(0)和m.group(1)都有內(nèi)容,那么m.groupCount() = 1
分割
代碼片段:
String regEx = "::"; Pattern p = Pattern.compile(regEx); String[] r = p.split("xd::abc::cde");
split()方法執(zhí)行后,獲得集合{"xd","abc","cde"},其實分割時還有更簡單的方法:
String str = "xd::abc::cde"; String[] r = str.split("::");
替換(刪除)
代碼片段:
String regEx = "a+"; //表示一個或多個a Pattern p = Pattern.compile(regEx); Matcher m = p.matcher("aaabbced a ccdeaa"); String s = m.replaceAll("A");
使用replaceAll()方法,用"A"替換匹配到的字符串,結(jié)果為"Abbced A ccdeA"
如果寫成空串,即可達到刪除的功能,比如:
String s=m.replaceAll("");
結(jié)果為"bbced ccde"
上面的用例是全部替換,實際上還有更多替換用例。
替換首次出現(xiàn)的字符
代碼片斷:
Pattern pattern = Pattern.compile("正則表達式"); Matcher matcher = pattern.matcher("正則表達式 Hello World,正則表達式 Hello World"); String s = matcher.replaceFirst("Java");
替換第一個符合正則的數(shù)據(jù)
多樣化替換字符串
代碼片斷:
Pattern pattern = Pattern.compile("正則表達式"); Matcher matcher = pattern.matcher("正則表達式 Hello World,正則表達式 Hello World "); StringBuffer sbr = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(sbr, "Java"); } matcher.appendTail(sbr);
這個片斷也許無法看出與replaceAll()的區(qū)別,但是使用appendReplacement和appendTail方法可以使用多個不同的替換字符串,就像[1]所說,替換字串可以是Java程序計算出來的,而不是固定的,一個很詳細的例子:string.replaceAll()中的特殊字符($ \)與matcher.appendReplacement。