这个想法来至于:《爽!網頁的中文與英、數字、符號間,終於自動加空白了》 其实我也一直有这样的想法,很多人发帖的时候没有注意中文和英文之间的空格,而排出来不够好看,比如
浏览器里面Chrome是不是比Firefox快?
这样会是不是更好?
浏览器里面 Chrome 是不是比 Firefox 快?
还有字母大小写的问题。 不知道有没有什么靠谱的办法在在应用上面就自动处理掉,服务端的也好,JS 的也好。
这里有这个项目:https://github.com/gibuloto/paranoid-auto-spacing
演示效果用 Chrome 安装 https://chrome.google.com/webstore/detail/paphcfdffjnbcgkokihcdjliihicmbpd 这个插件就能看到效果。
源码中的实现方式:
function insert_space(text) {
// 英文、數字、符號 ([a-z0-9~!@#&;=_\$\%\^\*\-\+\,\.\/(\\)\?\:\'\"\[\]\(\)])
// 中文在前
text = text.replace(/([\u4E00-\u9FA5])([a-z0-9@#&;=_\[\$\%\^\*\-\+\(\/])/ig, '$1 $2');
// 中文在後
text = text.replace(/([a-z0-9#!~&;=_\]\,\.\:\?\$\%\^\*\-\+\)\/])([\u4E00-\u9FA5])/ig, '$1 $2');
// 考慮增加 - + / * 前後的空白
return text;
}
目前 paranoid-auto-spacing
这个是有 Bug 存在的,某些场景下面不需要空格。
比如:
2012年12月开始新的历程
2000万的用户,其中有200人是....
漢學家稱這個空白字元為「盤古之白」,因為它劈開了全形字和半形字之間的混沌。另有研究顯示,打字的時候不喜歡在中文和英文之間加空格的人,感情路都走得很辛苦,有七成的比例會在 34 歲的時候跟自己不愛的人結婚,而其餘三成的人最後只能把遺產留給自己的貓。畢竟愛情跟書寫都需要適時地留白。 这。。。
ruby 1.9.3, need more unit test
string = "浏览器里面Chrome是不是比Firefox快?"
string.scan(/([^[[:ascii:]]]*)([[:ascii:]]*)([^[[:ascii:]]]*)/).flatten.map(&:strip).reject(&:empty?).join(" ")
=> "浏览器里面 Chrome 是不是比 Firefox 快?"
@quakewang cool
string = "浏览器里面Chrome是不是比Firefox快?2012年12月开始新的历程,2000万的用户,其中有200人是...."
string.scan(/([^[[a-zA-Z]]]*)([[a-zA-Z]]+)([^[[a-zA-Z]]]*)/).flatten.map(&:strip).reject(&:empty?).join(" ")
#=> "浏览器里面 Chrome 是不是比 Firefox 快?2012年12月开始新的历程,2000万的用户,其中有200人是...."
ruby 1.9.3, need more unit test
我觉得 hooopo 说的很对,难点不在于编写正则表达式,在于确定规则。
我觉得你们实现都有个前提:非要把复杂的逻辑通过一个`正则'来实现,为什么不能单独实现呢?
#8 楼 @huacnlee 华顺,我给个不错的建议,你可以通过执行多次 gsub 操作,然后把他们串成一串,就类似于设计模式中的组合模式一样,没必要一次就非要把最复杂的逻辑搞定吧...
我下面给个 shell 下的脚本实现,仅作参考:
command ruby -ip \
-e 'gsub(/([a-zA-Z])(?=\p{han})/, "\\1 ")' \ # => 如果汉字前面是英文, 在汉字前面加空格.
-e 'gsub(/(?<=\p{han})([a-zA-Z])/, " \\1")' \ # => 如果汉字后面是英文, 在汉字后面加空格.
"$@"
只要你制定出规则,你可以通过-e 添加任意多的逻辑。对吧?