在進行文本挖掘時,TSQL中的通配符(Wildchar)顯得功能不足,這時,使用“CLR+正則表達式”是非常不錯的選擇,正則表達式看似非常復雜,但,萬變不離其宗,熟練掌握正則表達式的元數據,就能熟練和靈活使用正則表達式完成復雜的Text Mining工作。
一,正則表達式的特殊字符
1,常用元字符
用以匹配特定的字符(字母,數字,符號),注意字母是區分大小寫的:
2,重復字符或分組
指定前面一個字符或分組重復的次數:
3,分組,轉義,分支,限定符
這些字符有特定的含義和用途:
二,分組引用
分組,是使用小括號指定的一個子表達式;分組引用,是指在表達式中,重復使用子表達式,使正則表達式的寫法更簡潔。默認情況下,正則表達式為每個分組自動分配一個組號,規則是:組號從1開始,從左向右,組號依次加1(base-1),例如,第一個分組的組號為1,第二個分組的組號為2,以此類推。
分組定義的三種形式:
1,通過組號引用分組
在正則表達式前面定義一個分組(exp),在表達式的後面,能夠通過組號引用該分組的表達式,引用分組的語法是:\group_number;
例如:\b(\w+)\b\s+\1\b,在該正則表達式中,只存在一個分組(\w+),組號是1,在該分組的後面,使用\1來引用該分組,將\1替換為分組的子表達式,等價於:\b(\w+)\b\s+(\w+)\b。
2,通過分組名引用分組
在正則表達式中,能夠對分組命名,命名的分組格式:(?<name>exp),分組名是name,通過name來引用該分組的格式是:\k<group_name>,通過分組名和組號引用分組,其文本匹配的行為是一樣的。
例如:\b(?<word>\w+)\b\s+\1\b,在該分組的後面中,使用\k<word>引用該分組,將\k<word>替換為分組的子表達式,等價於:\b(\w+)\b\s+(\w+)\b。
3,無法引用的分組
(?:exp):使用這種語法定義的分組,不能引用,只能在當前的位置匹配文本,正則表達式不為該分組自動分配組號。
三,斷言查找
斷言是一個邏輯表達式,只有當表達式為真時,匹配成功。當匹配成功時,返回文本,返回的文本不包含前綴或後綴,即,斷言用於查找在特定“文本”之前或之後的文本。斷言的四種語法:
1,後綴匹配
(?=exp):文本的後面匹配表達式exp,返回exp位置之前的表達式。後綴匹配,和TSQL的 "%ing"類似;
比如正則表達式:\b\w+(?=ing\b)
分析:斷言其後綴是ing,並且是單詞的結尾(\b),匹配以ing結尾的單詞,但返回單詞的前面部分,ing之前的部分;
例如,查找“I'm reading a book”,它會匹配“reading”,因為該字符後面以ing結尾,該正則表達式返回read,斷言返回的文本不包含後綴。
2,前綴匹配
(?<=exp):文本的前面匹配表達式exp,返回exp位置之後的表達式。前綴匹配,和TSQL的 "re%"類似;
比如正則表達式:(?<=\bre)\w+\b
分析:單詞的打頭(\b),並且單詞的前綴是re,匹配以re開頭的單詞,返回單詞的後半部分,re之後的部分;
例如,查找“I am reading a book”,它會匹配“reading”,因為該字符前面以re打頭,該正則表達式返回ading,斷言返回的文本不包含前綴。
3,查找前綴或後綴不是特定文本的文本
這兩個斷言查找,跟前面兩個相反,作用不大,簡單了解一下:
3.1 比如,正則表達式:\b\w+(?!ing\b)
分析:不匹配以ing結尾的單詞,查找“I am reading a book”,返回的文本:I,am,a,book
3.2 比如,正則表達式:(?<!\bre)\w+\b
分析:不匹配以re打頭的單詞,查找“I am reading a book”,返回的文本:I,am,a,book