背景:最近在做中文分詞的時候,發現分詞后的數據中出現很多特殊字符,即使進行了去停用詞操作,但是特殊字符太多,也不可能都加到停用詞里,所以就准備用正則去掉,正則很簡單,直接上代碼:
/** * 正則去掉unicode等特殊字符 * */ private static String regularFilter(String text) { /** * \p{L}或\p{Letter}:來自任何語言的任何形式的字母。 * \p{Ll}或\p{Lowercase_Letter}:小寫字母,帶有大寫字母。 * \p{Lu}或\p{Uppercase_Letter}:具有小寫字母變體的大寫字母。 * \p{Lt}或\p{Titlecase_Letter}:僅當單詞的第一個字母大寫時,出現在單詞開頭的字母。 * \p{L&}或\p{Cased_Letter}:存在小寫和大寫變體(Ll,Lu和Lt的組合)的字母。 * \p{Lm}或\p{Modifier_Letter}:一個特殊字符,用作字母。 * \p{Lo}或\p{Other_Letter}:沒有小寫和大寫變體的字母或表意文字。 * \p{M}或\p{Mark}:打算與另一個字符組合的字符(例如重音符號,變音符,封閉框等)。 * \p{Mn}或\p{Non_Spacing_Mark}:旨在與另一個字符組合而又不占用多余空間(例如重音符號,變音符號等)的字符。 * \p{Mc}或\p{Spacing_Combining_Mark}:一個字符,旨在與另一個占用額外空間的字符組合(許多東方語言中的元音符號)。 * \p{Me}或\p{Enclosing_Mark}:一個字符,它將與之組合的字符括起來(圓形,正方形,鍵帽等)。 * \p{Z}或\p{Separator}:任何類型的空格或不可見的分隔符。 * \p{Zs}或\p{Space_Separator}:一個不可見但占用空間的空白字符。 * \p{Zl}或\p{Line_Separator}:行分隔符U + 2028。 * \p{Zp}或\p{Paragraph_Separator}:段落分隔符U + 2029。 * \p{S}或\p{Symbol}:數學符號,貨幣符號,裝飾符號,畫框的字符等。 * \p{Sm}或\p{Math_Symbol}:任何數學符號。 * \p{Sc}或\p{Currency_Symbol}:任何貨幣符號。 * \p{Sk}或\p{Modifier_Symbol}:組合字符(標記)本身就是完整字符。 * \p{So}或\p{Other_Symbol}:不是數學符號,貨幣符號或組合字符的各種符號。 * \p{N}或\p{Number}:任何腳本中的任何數字字符。 * \p{Nd}或\p{Decimal_Digit_Number}:除表意文字外,任何文字中的數字從零到九。 * \p{Nl}或\p{Letter_Number}:看起來像字母的數字,例如羅馬數字。 * \p{No}或\p{Other_Number}:上標或下標數字,或者不是0到9的數字(表意文字中的數字除外)。 * \p{P}或\p{Punctuation}:任何一種標點符號。 * \p{Pd}或\p{Dash_Punctuation}:任何類型的連字符或破折號。 * \p{Ps}或\p{Open_Punctuation}:任何類型的左括號。 * \p{Pe}或\p{Close_Punctuation}:任何類型的右括號。 * \p{Pi}或\p{Initial_Punctuation}:任何形式的開頭引號。 * \p{Pf}或\p{Final_Punctuation}:任何形式的結束語。 * \p{Pc}或\p{Connector_Punctuation}:標點符號,例如連接單詞的下划線。 * \p{Po}或\p{Other_Punctuation}:不是破折號,方括號,引號或連接符的任何一種標點符號。 * \p{C}或\p{Other}:不可見的控制字符和未使用的代碼點。 * \p{Cc}或\p{Control}:ASCII或Latin-1控制字符:0x00–0x1F和0x7F–0x9F。 * \p{Cf}或\p{Format}:不可見的格式指示符。 * \p{Co}或\p{Private_Use}:保留供私人使用的任何代碼點。 * \p{Cs}或\p{Surrogate}:采用UTF-16編碼的一對代理對的一半。 * \p{Cn}或\p{Unassigned}:未分配任何字符的任何代碼點。 * */ // 替換成",",防止本來不是一起的詞被分配到一起影響分詞結果,同時","會被停用詞去掉 return text.replaceAll("[\\pM\\pZ\\pS\\pN\\pP\\pC]+", ","); }
如代碼中注釋所示,通過使用正則來匹配Unicode所屬類別,直接過濾掉了Unicode,非常方便!
注意的是,正則中沒有使用“\p{L}”,這是因為“\p{L}”也會過濾掉中文字符,需要注意,其它的自己看說明並嘗試下,就比較清楚了!
參考資料:http://www.regular-expressions.info/unicode.html