作者MichaelHsin (BBS之虫)
看板RegExp
标题Re: [问题] 中英文区分
时间Fri Nov 9 00:14:26 2007
※ 引述《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
1F:→ MichaelHsin:其实这两篇用的 zero-width look-(ahead|behind) 和 11/09 00:18
2F:→ MichaelHsin:s///e 的方法都可以互换 :Qoo 11/09 00:18
3F:推 buganini:还可以先转成UTF-8处理完在转回去XD 11/09 06:43
4F:推 godfat:推先转码 XDDD 11/09 13:25
5F:推 MichaelHsin:转码的话,标准 Big5-1985 好解决,要是资料有 UAO 之 11/09 17:56
6F:推 MichaelHsin:类的东西,目前好像还没有现成的转码器可以转 UAO 的 11/09 17:57