作者MichaelHsin (BBS之虫)
看板RegExp
标题Re: [问题] 中英文区分
时间Thu Nov 8 23:38:34 2007
※ 引述《hunterfish (可爱的阿宏)》之铭言:
: 没想到PTT也有地方可以讨论RegExp耶
: 以後又多一个常逛的版了^^
: 前一阵子写RegExp
: 一直试不出来要如何写才能让中文和英文区隔出来
: 比如说:
: 我叫hunterfish我现在在RegExp版
: 要变成
: 我叫 hunterfish 我现在在 RegExp 版
: 我原本想法是想碰到英文字为首和结尾就自动塞入一个空隔
: 不知道这种写法要怎样去实作
: 还有其他更好的写法吗?
: 先谢谢这边的大大们了!!
以 perl 为例,配合 zero-width look-(ahead|behind):
=====
# $w 和 $n 只是方便阅读後面的 regex,如果不喜欢的话直接代换在里面也是可以
# 「英文字」的定义
$w = "-A-Za-z0-9_";
# $w 加上空白
$n = "$w ";
# input: $str
# 把「英文字」的前面加上空白,如果有空白或是行首就不加
$str =~ s/(?<=[^$n])([$w]+)/ $1/g;
# 把「英文字」後面加上空白,如果已有空白或是行尾/换行符号就不加
$str =~ s/([$w]+)(?=[^$n])/$1 /g;
=====
有些小细节像 $w, $n 里的 "-" 为什麽要放最前面,想一下它代换进什麽地方应该
就懂了 :p
另外,因为 Big5 的第二个字元(low-byte)范围包含了 $w 定义的字元,会导致上面
的 [$w]+ 会把 Big5 的 low-byte 也包进来,而导致空白加在不对的地方,所以要
另外处理。UTF-8 则是没这个问题。
--
芸曰:「今世不能,期以来世。」
余曰:「来世卿当作男,我为女子相从。」
芸曰:「必得不昧今生,方觉有情趣。」
余笑曰:「幼时一粥犹谈不了;若来世不昧今世,合卺之夕,细谈隔世,更无合
眼时矣。」
-- 沈复 《浮生六记》
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.55