如何将匹配指定C9系列字符串的正则表达式改写得更短更优雅?
正则表达式简化方案
待匹配完整字符串集合:
C910 C918 C920 C924 C925 C926 C928 C929 C930 C937 C940 C942 C943 C947 C950
原有可用正则:^(C9[1-5]0|C9[12]8|C94[237]|C92[4569]|C937)$
优化后版本
完全等价于原有正则的更简洁版本如下:
^C9(?:[1-5]0|[12]8|4[237]|2[4569]|37)$
优化说明
- 所有匹配项均共享前缀
C9,将其提取到分支分组外,直接减少重复字符冗余 - 使用非捕获分组
(?:)包裹所有分支,相比原正则的捕获分组,无额外捕获需求时性能更优,也不会改变匹配逻辑 - 整体长度比原正则缩短近20%,同时没有损失可读性,匹配范围和原正则完全一致,不会出现多匹配或漏匹配的问题
如果追求极致简洁性愿意牺牲少量可读性,也可以将C928的规则合并到C92的数字范围中得到长度更短的版本,但实际使用中并不推荐,可读性下降带来的维护成本升高远不如上面的版本均衡。
内容的提问来源于stack exchange,提问作者stonypaul
相关产品推荐
相关产品推荐

