JavaScript正则:更高效移除字符串双空格与空行的实现方法
正则处理逻辑优化方案
原4步实现存在三个明显缺陷:
- 行首、行尾仅删除单个空格,若存在2个及以上连续前导/尾随空格会清理不彻底
- 空白行匹配仅适配Windows格式的
\r\n换行,对Unix系\n、旧Mac系统\r换行兼容性差,且遇到3个及以上连续换行时无法一次性压缩为单换行 - 4次全文正则扫描性能偏低,完全可以合并步骤
最优2步实现(无清理死角、兼容所有主流换行格式)
需要给正则开启两个修饰符:
- 全局匹配(
g修饰符):替换所有匹配项而非仅第一个 - 多行模式(
m修饰符):让^/$可以匹配每一行的行首/行尾,而非整个字符串的首尾
第一步:一次性完成所有空格清理(替换原流程前3步)
正则:
/^ +| +$|( )+/gm
替换值:
$1
原理:
- 匹配行首连续空格、行尾连续空格时,不会触发捕获组,替换值
$1为空,直接实现首尾空格删除 - 匹配行内2个及以上连续空格时,捕获组会拿到单个空格,替换后自动将连续多空格压缩为单个空格
第二步:一次性清理所有多余空白行(替换原流程第4步)
正则:
/(\r?\n|\r)(?:\r?\n|\r)+/g
替换值:
$1
如果不需要保留原始换行格式,直接将替换值设为\n、统一换行为Unix格式即可。
原理:
- 兼容
\r\n、\n、\r三种换行格式 - 匹配2个及以上连续换行时,保留第一个换行,其余全部删除,无论多少个连续空行都会被压缩为单个换行
效率对比
原流程需要4次全文扫描,优化后仅需2次全文扫描,文本量较大时性能提升1倍以上,且不会出现原逻辑的漏删问题。如果追求极致短代码,也可以通过正则回调把两步合并为单步扫描,但可维护性会明显下降,不推荐生产环境使用。
内容的提问来源于stack exchange,提问作者straj
相关产品推荐
相关产品推荐

