5 行 Kotlin 代码实现自动给中文英文之间加入合适的空格


「有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。与大家共勉之。」—— vinta/paranoid-auto-spacing

先看完整代码:

fun isLatin(c: Char) = c.toInt() < 256

fun allowSpace(c: Char) = c !in " ,。;「」:《》『』、[]()*_"

fun String.addSpace() = this.toCharArray().map { it.toString() }.reduce { acc, s ->
    if (isLatin(acc[acc.lastIndex]) != isLatin(s[0]) && allowSpace(s[0]) && allowSpace(acc[acc.lastIndex])) acc + " " + s  else acc + s
}

当然如果强行再减,代码也可以缩短成 3 行。

关于中英文之间在什么情况下加空格。可以参考掘金这篇文章。 :译文排版规则指北#空格

step01: 首先把目录文字分解成单个字符串集合:

   var stringList: List<String> = this.toCharArray().map { it.toString() }

map 操作符:返回一个每一个元素根据给定的函数转换所组成的 List。

step02: 使用 reduce 操作符将单个字符串拆分组合。

   stringList.reduce { acc, s ->{ 处理 }

reduce 操作符:在从第一项到最后一项通过一个函数累计所有的元素。

step03: 判断前后是否需要加空格

isLatin(c: Char) :判断此字符是否为拉丁符号(字母,数字,半角符号等)

allowSpace(c: Char):是否允许有空格(中文全角符号两边不需要加空格)

前后字符分别为中英文,并且中文字符不能为全角符号。

代码实现 :

 if (isLatin(acc[acc.lastIndex]) != isLatin(s[0]) 
    && allowSpace(s[0]) && allowSpace(acc[acc.lastIndex]))

如果满足条件则在字符之间加上空格:

return  acc + " " + s

相反的话保持原样:

return  acc + s

step04: 使用 && 测试样例:

var text = "在LeanCloud上,数据存储是围绕AVObject进行的。今天出去买菜花了5000元。"
text = text.addSpace()
println(text)

输出为:

在 LeanCloud 上,数据存储是围绕 AVObject 进行的。今天出去买菜花了 5000 元。


关于我:微博简书掘金Github

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,131评论 25 709
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,514评论 2 59
  • 海伦公主阅读 3,051评论 0 0
  • 其实路很远,所以别害怕出发 ! 最近有好多小伙伴私信问我怎么好久没有更文啦!其实,最近一直在看书,也在业余学摄影。...
    糯米红烧肉阅读 2,688评论 2 4
  • 以前我会因为一件小事情而和别人争的面红耳赤的,现在心态好多了,因为当对方情绪激动的时候,我自己可以控制自己的情绪,...
    暖儿_8833阅读 2,454评论 0 1

友情链接更多精彩内容