行数统计
统计行数、检测注释并分析您的文本或代码
100% 客户端处理
行统计
| 指标 | 计数 | 百分比 |
|---|---|---|
| 总行数 | 0 | - |
| 代码行 | 0 | - |
| 注释行 | 0 | - |
| 空行 | 0 | - |
| 非空行 | 0 | - |
| 最大行长度 | 0 | - |
| 平均行长度 | 0 | - |
这个行数计数器把任意粘贴进来的文本或源代码拆分为总行数、空行、注释行和真正的代码行,并给出最长行与平均行长。它适合快速评估文件规模的开发者、检查文档结构的写作者,以及任何需要比简单字数统计更细致信息的人。所有内容随输入实时更新,并只停留在你的机器上。
各项指标如何计算
| 指标 | 定义 |
|---|---|
| 总行数 | 统一换行符并移除一个末尾换行之后的行数 |
| 非空行 | 去除首尾空白后至少含一个字符的行(开启去空白时) |
| 空行 | 总行数减去非空行 |
| 注释行 | 第一个非空白字符匹配注释标记的行 |
| 代码行 | 非空行减去注释行 |
| 最长 / 平均行长 | 基于非空行计算,如启用则先去除首尾空白 |
由于代码行、注释行和空行都从同一个非空计数推导而来,它们相加始终等于总数,不存在重复计算。
实操示例:一个简短的 Python 文件
在开启去空白和注释识别的情况下粘贴这九行片段:
import math
# circle area
def area(r):
return math.pi * r * r
# --- test ---
if __name__ == "__main__":
print(area(2))
统计表会报告:
- 总行数: 9
- 非空行: 7(第 2、6 两个空行被排除)
- 空行: 2
- 注释行: 2(
# circle area和# --- test ---) - 代码行: 5
- 最长行长: 26(
if __name__ == "__main__":) - 平均行长: 16.0
如果你启用「去除空白」,带缩进的 return 行会去掉四个前导空格再测量,这就是平均值落在 16.0 而不是更高的原因。
注释识别规则与盲区
这刻意采用一种快速的行前缀启发式,而不是解析器。这让它无需配置就能跨语言使用,但也存在已知盲区:
- 只检查行首。
x = 1; // set x是代码,/* ... */中开括号位于行中间的块也一样。 - C 预处理器指令会误判。
#include <stdio.h>以#开头,会被算作注释,尽管它是代码。 - 指针运算会误判。 C 中以
*ptr = 5;开头的行匹配*注释规则而被算作注释,而*/风格的收尾却不会被识别。 - Shell 参数会误判。 以
--verbose开头的行会被算作注释,因为--是 SQL/Lua 的标记。 - 块注释不跨行跟踪。 只有带标记的行才被计数;一个多行块贡献的注释行数等于它带标记的行数,而不是它跨越的行数。
把计数当作信号,而不是审计。针对特定语言,静态分析器总归更精确。
换行符与末尾换行边界情况
来自 Windows 的文件带 CRLF 结尾,来自旧式 Mac 的文件带单独的 CR,Unix 工具则用 LF。计数器先把三者统一为 LF,所以不同来源的行数彼此吻合。随后它恰好移除一个末尾换行:"a\nb\n" 计为 2 行而不是 3 行,而 "a\nb\n\n" 计为 3 行并带一个空行。空输入返回全零,而不是报错。如果关闭去空白,一行纯空格不再算作空行,会连同填充空格一起计入行长统计。
行数能说明什么、不能说明什么
代码行数(LOC)是最古老的软件度量之一,也是被误用最多的指标之一。原始总数描述的是规模,而非质量:一个精炼优雅的函数和一个臃肿的函数可以完成同样的工作,行数却差很远;用 LOC 排名开发者产出更是出了名的适得其反——它奖励啰嗦,惩罚那些删除冗余代码的重构。
行数细分真正有价值的地方,在于刻画一个代码库。注释比例高,通常说明代码有良好文档——也可能是过时的注释。最长行很长,往往提示格式上的欠债。空行比例意外上升,可能暴露了生成或机器合并产出的文件。对散文和数据而言,同样的数字能回答实际问题:这份日志有没有空行?我的数据集是不是一行一条记录?我的行长是否一致?本工具无需搭建静态分析套件,就能立刻给你这些信号。
实用技巧
- 在重构前后比较同一个文件。 粘贴旧版本,记下代码行和注释行,再粘贴新版本。代码行变少而注释数不变,通常意味着真正的简化;注释行下降则是警告,而不是胜利。
- 强制列宽上限。 如果项目把行宽限制在 80 或 100 个字符,最长行长会立刻显示是否有内容越界,平均值则告诉你文件其余部分还有多少余量。
- 用空行百分比审查数据和日志。 格式良好的 CSV 应包含零个空行,而分块导出的日志常常多出空行分隔符。意外的空行占比能在数据进入数据库之前发现畸形的导出。
- 绝不用代码行比较语言或人。 Python 用十行表达的东西,Java 可能要写三十行。用计数追踪单个文件或项目随时间的变化,而不是给语言或开发者排名。
相关工具
常见问题
什么算作注释行?
一行中第一个非空白字符是 `//`、`#`、`--`、`<!--`、`/*`,或 `*`(且后面不跟 `/`)时,会被当作注释。这覆盖了 JavaScript、C、Java、Python、Ruby、Bash、SQL、Lua、HTML 和 CSS 风格的注释。
它如何处理混合换行符?
支持。统计前会把 CRLF(Windows)和 CR(旧式 Mac)统一成 LF(Unix),所以同一个文件无论由什么工具生成,行数都一致。末尾的单个换行会被丢弃,而不会多算一个空行。
可以统计空行吗?
可以。空行会单独报告,既有数量也有占总数百分比。开启去除空白后,只含空格或制表符的行也会算作空行。
像 `x = 1; // set x` 这样的行会被算作注释吗?
不会。识别只检查行首,所以行尾的行内注释不会让整行变成注释,它仍被算作代码行。只有以注释标记开头的行才被归类为注释。
末尾换行会让行数多出一行吗?
不会。拆分前会先移除一个末尾换行,所以以换行结尾的文件和不以换行结尾的文件计数相同。两个末尾换行会留下一个真实的空行计入统计。
关闭「去除空白」后会发生什么变化?
行长统计会改为测量包含首尾空白的原始行,只含空白的行不再算作空行,而是算作非空行。当你要测量的正是缩进宽度时,关闭它会更有用。
由 HandyTools Hub 团队审校 · 最后更新