作者 Chien-Kang Huang <ckhuang@gemini.ntu.edu.tw> 讨论 tw.bbs.comp.lang.perl 标题 Re: [Q] split 中文 时间 3 月 15 日 Clem Chuang <clem@freenix.ml.org> wrote: > Clem Chuang <clem@freenix.ml.org> writes: >> 通常要将各别英文字抓出来, 只须 >> @words=split /[^a-zA-Z]+/; >> >> 但面对同时包含中英文的字串, 要将各别的中文字元与英文 word 一起 split 进 >> list 要怎麽作呢? 中文并没有 delimiter。 >> >> 虽然暴力法可解决, 但是效率应不佳, 有没有 built-in 的较正规解法。 > 刚刚试一下, 发现先 > s/([\xa1-\xf9][\x40-\x7e\xa1-\xfe])/ $1 /g; > 再 split, 效率应该不会太差, 请问是否有更好方法。 my $big5 = q{ [\xA1-\xFE][\x40-\x7E\xA1-\xFE] }; my $big5plus = q{ [\x81-\xFE][\x40-\x7E\x80-\xFE] }; my @chars = /$big5|$ascii+/gox; or my @chars = /$big5plus|$ascii+/gox; ================================================== 作者 luors <luors@csie.nctu.edu.tw> 讨论 tw.bbs.comp.lang.perl 标题 Re: [Q] split 中文? 时间 3 月 16 日 Clem Chuang <clem@freenix.ml.org> wrote: > Clem Chuang <clem@freenix.ml.org> writes: > > 通常要将各别英文字抓出来, 只须 > > @words=split /[^a-zA-Z]+/; > > 但面对同时包含中英文的字串, 要将各别的中文字元与英文 word 一起 split 进 > > list 要怎麽作呢? 中文并没有 delimiter。 > > 虽然暴力法可解决, 但是效率应不佳, 有没有 built-in 的较正规解法。 > 刚刚试一下, 发现先 > s/([\xa1-\xf9][\x40-\x7e\xa1-\xfe])/ $1 /g; > 再 split, 效率应该不会太差, 请问是否有更好方法。 > -- Clem 试试看: 下面这个可以用, 不过 big5 并没有用完这个□围: @a = grep($_, split(/([\xA1-\xFE][\x40-\x7E\xA1-\xFE])|(\w+)/og, $input)); 这个可以挑自己想要的部份, 不过效率可能比上面的差, 没比过: @a = grep($_, split(/([\xA1-\xA2][\x40-\x7E\xA1-\xFE])| # 符号 ( [\xA3][\x40-\x7E\xA1-\xBF])| # ([\xA4-\xC5][\x40-\x7E\xA1-\xFE])| # 常用字 ( [\xC6][\x40-\x7E] )| # ([\xC9-\xF8][\x40-\x7E\xA1-\xFE])| # 次常用字 ( [\xF9][\x40-\x7E\xA1-\xD5])| # (\w+ ) # 英文字 /ogx, $input)); 有时看到一些香港字掉在 high bit Cx 的地方, 很头痛. 翻翻那本买不起的CJKV, 发现香港那区都是洞, 好像要一个一个写, 麻烦. 更奇怪的是, 这些字在Access 里看的到, 在DOS 视窗下却只看到一个空白, 实在不知该不该将其归为中文. Clem兄有没有Lisp的版本? :) -- +-----------------------------------------------------------------------------+ 骆仁山 luors@csie.nctu.edu.tw LCamel