正则表达式匹配所有普通分数:穷举18个符号是否为最优方案?
关于分数符号正则匹配的最优实现分析
首先得说,你直接穷举所有18个分数符号的正则写法完全没问题,甚至在很多场景下是非常棒的选择,理由很简单:
- 它超级直观,不管是谁接手你的代码,一眼就能看明白要匹配的是哪些符号,几乎没有维护成本
- 绝对不会出现误匹配——毕竟你明确列出了所有目标符号,不会不小心包含进其他你不需要的分数字符
不过如果咱们追求更简洁的写法,其实可以利用这些符号的Unicode编码特性来优化。你列的这些分数符号在Unicode里大多是连续排列的,所以可以把连续的符号合并成范围,比如原来的:
/[¼½¾⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞]/
可以改成:
/[¼-¾⅐-⅒⅓-⅔⅕-⅘⅙-⅚⅛-⅞]/
这样字符数少了不少,但匹配的范围和穷举完全一致,因为:
- ¼、½、¾ 是连续的Unicode字符(U+00BC到U+00BE)
- ⅐、⅑、⅒ 是连续的(U+2150到U+2152)
- ⅓、⅔ 连续(U+2153到U+2154)
- ⅕到⅘ 连续(U+2155到U+2158)
- ⅙、⅚ 连续(U+2159到U+215A)
- ⅛到⅞ 连续(U+215B到U+215E)
那到底哪种是最优?得看你的核心需求:
- 如果可读性和明确性是第一位,直接穷举的写法就是最优的——没有任何歧义,哪怕是不懂Unicode的人也能看懂
- 如果想让代码更简洁,合并成范围的写法更优,而且现代正则引擎对字符集的处理效率和穷举几乎没区别,完全不用担心性能问题
这里要提醒一句:别用更宽泛的Unicode属性(比如\p{Number_Fraction})来匹配,这种写法会包含很多你不需要的分数符号(比如⅟、一些东亚的分数符号),反而容易出现误匹配,不符合你只匹配这18个符号的需求。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

