Notepad++中匹配每行尾字符应使用^(.*)(.)$,需启用“正则表达式”模式且不勾选“匹配换行符”;替换用\1X可保留前文改末字符,注意BOM、空行及Unicode字符处理。

正则匹配行尾字符的正确写法
Notepad++ 默认使用 PCRE(Perl 兼容正则),但「行尾」必须用 $,且需勾选「匹配换行符」以外的选项——否则 $ 只匹配整个文本末尾,不匹配每行末尾。关键在于启用「. 匹配换行符」以外的「扩展搜索模式」:实际要勾选的是「匹配换行符」下方的「扩展(\n, \r)」?错。真正起效的是「搜索模式」选「正则表达式」+ 确保「匹配换行符」未勾选(否则 $ 会失效)。
想捕获每行最后一个可见字符(不含换行符),正则应写为:^(.*)(.)$,其中:
-
^表示行首(在 Notepad++ 中启用「匹配换行符」后,^才能匹配每行开头) -
(.*)贪婪匹配行中全部内容(除换行符外) -
(.)捕获最后一个非换行字符 -
$确保该字符后面紧跟行尾(不是换行符本身)
替换时保留前面内容、只改最后一个字符
如果目标是把每行最后一个字母替换成 X,替换框填:\1X。这里 \1 是第一组括号捕获的内容(即除最后一个字符外的整行),X 是你要的新字符。
常见错误:
- 用
.$直接替换 → 会删掉所有行尾字符,但无法保留前面内容 - 忘记勾选「正则表达式」模式,误用「普通」或「扩展」模式 → 正则语法完全不生效
- 文本含 Windows(
\r\n)和 Unix(\n)混用换行 →$仍能正确识别行尾,但需确保「视图 → 显示符号 → 显示所有字符」确认换行符类型
处理空行和单字符行的边界情况
^(.*)(.)$ 在 Notepad++ 中对空行(只有 \r\n 或 \n)完全不匹配,这是预期行为;但对单字符行(如 a)会匹配成功: 为空, 为 a。
若需跳过单字符行,改用:^(.*)(.{2})$ → 但这样会漏掉倒数第二字符,不可取。更稳妥的是先人工检查或分两步:第一步用 ^[^\r\n]{2,}$ 选中长度 ≥2 的行,再执行替换。
另一个现实问题:中文、emoji 或全角符号是否算「一个字符」?是的,Notepad++ 正则按 Unicode 码点处理,一个汉字、一个 emoji 都算 . 匹配的一个字符。
为什么不用 [\s\S]* 或 .*?
Notepad++ 的 PCRE 引擎不支持 [\s\S] 这种写法(会报错「无效的正则表达式」);.*? 虽然语法合法,但懒惰匹配在行尾场景下无优势,反而可能因回溯导致性能下降(尤其超长行)。实测 ^(.*)(.)$ 在万行文本中响应稳定。
真正容易被忽略的一点:如果你的文件编码是 UTF-8 with BOM,Notepad++ 有时会在首行开头插入不可见的 BOM 字符(\xEF\xBB\xBF),它会被 ^ 匹配到,干扰第一行的「最后一个字符」定位。建议先用「编码 → 转为 UTF-8 无 BOM」再操作。


















