匹配真正空行应使用/^\s$/m,其中^和$在多行模式下匹配每行首尾,\s匹配零个或多个空白符;严格无空白则用/^$/m。

空行和空白字符在文本处理中很常见,但正则匹配时容易出错。关键在于区分“真正空行”(只含换行符)和“看似空行”(含空格、制表符等),并理解不同修饰符对换行符的处理影响。
匹配真正的空行(仅换行符)
空行通常指只包含行首到行尾之间无任何可见或不可见字符(除换行符外)的行。最稳妥写法是:
/^\s*$/m
说明:
• ^ 和 $ 在多行模式(m 标志)下分别匹配每行的开头和结尾
• \s* 匹配零个或多个空白字符(包括空格、制表符、换行符、回车符等)
• 加 m 是必须的,否则 ^ 和 $ 只匹配整个字符串首尾
如果严格只要“完全无字符(连空白也不许有)”,用 /^$/m;但实际中多数场景允许空白符存在,所以 /^\s*$/m 更实用。
识别并捕获空白字符本身
有时需要定位或替换具体空白字符,而非整行。常用字符类如下:
- \s:匹配任意空白字符(等价于 [ \t\n\r\f\v])
- \t:制表符(U+0009)
- \n:换行符(U+000A,Unix/Linux/macOS 默认)
- \r:回车符(U+000D,Windows 行尾为 \r\n)
- \r?\n:兼容 Windows / Unix 行结束符的写法
例如,把所有连续空白(含换行)压缩成单个空格:
text.replace(/\s+/g, ' ')
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
排除空行,提取非空内容行
用 match() 提取所有非空行时,推荐反向逻辑:
const lines = text.match(/^\s*\S[\s\S]*/gm);
解释:
• ^\s*\S 确保行首跳过空白后至少有一个非空白字符
• [\s\S]* 匹配该行剩余任意字符(含换行符,避免被 . 漏掉)
• g 全局匹配,m 多行模式
更简洁的替代方案(适合简单场景):
text.split(/\r?\n/).filter(line => /\S/.test(line))
注意点:换行符差异与 Unicode 安全性
JavaScript 正则默认支持 Unicode,但某些旧环境对 \s 的定义可能不包含 U+2028(行分隔符)或 U+2029(段落分隔符)。如需全面覆盖,可显式写出:
/^[\s\u2028\u2029]*$/m
另外,g 标志配合 exec() 时要注意 lastIndex 重置问题;批量处理建议优先用 match() 或 replace()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










