看板 RegExp 關於我們 聯絡資訊
※ 引述《MichaelHsin (BBS之蟲)》之銘言: : 另外,因為 Big5 的第二個字元(low-byte)範圍包含了 $w 定義的字元,會導致上面 : 的 [$w]+ 會把 Big5 的 low-byte 也包進來,而導致空白加在不對的地方,所以要 : 另外處理。UTF-8 則是沒這個問題。 應付 Big5 的解法: 1. 正解:使用 Big5-aware regex engine 例如 perl 可以 use encoding 2. 惡搞解:正解不能用的時候 隨手想了一個,用 s///e 達成: ===== # 這是 strict Big5-1985 的定義範圍 # 要取廣義的 Big5-Eten 或是 Big5-UAO 可修改 $bh 和 $bl # Big5 high-byte $bh = "\\xa1-\\xfe"; # Big5 low-byte $bl = "\\xa1-\\xfe\\x40-\\x7e"; # greedy 取最長的連續 Big5 string,及其前、後一或零個字元,分別為 $2, $1, $3 # 如果 $1 不是空白,就在 $1 和 $2 間加上一個空白 # 如果 $3 不是空白,就在 $2 和 $3 間加上一個空白 # 兩行請自行接上 $str =~ s/(.?)((?:[$bh][$bl])+)(.?)/ $1 . (1 ne " " ? " " : "") . $2 . ($3 ne " " ? " " : "") . $3/ge; ===== 連同上篇,雖然是用 perl 寫的,但應該都可用各種語言/環境提供的 regex engine 做到同樣的效果。 -- 芸曰:「今世不能,期以來世。」 余曰:「來世卿當作男,我為女子相從。」 芸曰:「必得不昧今生,方覺有情趣。」 余笑曰:「幼時一粥猶談不了;若來世不昧今世,合巹之夕,細談隔世,更無合 眼時矣。」 -- 沈復 《浮生六記》 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.55
MichaelHsin:其實這兩篇用的 zero-width look-(ahead|behind) 和 11/09 00:18
MichaelHsin:s///e 的方法都可以互換 :Qoo 11/09 00:18
buganini:還可以先轉成UTF-8處理完在轉回去XD 11/09 06:43
godfat:推先轉碼 XDDD 11/09 13:25
MichaelHsin:轉碼的話,標準 Big5-1985 好解決,要是資料有 UAO 之 11/09 17:56
MichaelHsin:類的東西,目前好像還沒有現成的轉碼器可以轉 UAO 的 11/09 17:57