锚点不消耗字符
脱字符表示位置在文本或行的开头,美元符号表示位置在结尾。两个锚点都是零宽的:它们判断「当前位置合不合法」,不消耗任何字符,也不出现在匹配结果里。理解零宽这一点,就能解释为什么被锚点包住的替换可以只改内容不改边界。
单行与多行的差别
默认情况下,脱字符只匹配文本最开始、美元符号只匹配文本最末尾,即使文本里有换行。打开多行模式后,锚点改为在每一行的首尾都成立,这才是逐行处理时需要的语义。
基本信息
| 脱字符 | 零宽断言,匹配文本或行的起始位置 |
|---|---|
| 美元符号 | 零宽断言,匹配文本或行的结束位置 |
| 默认模式 | 只匹配整段文本的首尾,中间换行处不成立 |
| 多行模式 | 每行首尾均可匹配,Python 用 re.MULTILINE,JS 用 m 标志 |
| 末尾换行 | 多数引擎允许美元符号匹配「末尾换行之前」的位置,字符串校验时要留意 |
| 反斜杠变体 | 部分引擎提供只认绝对串首串尾的锚点写法,以官方文档为准 |
典型使用场景
- 整串校验:模式首尾加上脱字符与美元符号,拒绝包含式匹配
- 逐行提取配置项或日志字段,配多行模式对每一行生效
- 删除行尾多余空白,用行尾锚点定位而不影响其他内容
- 在文件开头或结尾插入内容,锚点保证只命中边界位置
- 校验注释行格式:行首必须是注释符号
锚点的典型写法
锚点的典型写法
grep '^root' /etc/passwd # 只看行首为 root 的行
grep 'bash$' /etc/passwd # 只看行尾为 bash 的行
grep -v '^#' conf.ini # 过滤掉注释行
grep -c '^$' conf.ini # 统计空行数量
sed 's/[[:space:]]*$//' f.txt # 删掉每行行尾的空白字符
awk '/^[ \t]*$/{n++} END{print n}' f.txt # 用行首锚点统计纯空白行锚点行为速查
| 写法 | 含义 | 适用场景 |
|---|---|---|
| 脱字符 | 文本或行的开头 | 行首校验、过滤注释行 |
| 美元符号 | 文本或行的结尾 | 行尾校验、清理尾部空白 |
| 两端同时使用 | 整串或整行约束 | 字段格式校验 |
| 多行模式下 | 每个换行前后都成立 | 逐行批处理 |
用美元符号做整串校验时要注意末尾换行的处理差异:部分语言对末尾带换行的字符串仍判定匹配,部分则要求使用绝对串尾锚点。校验严格字段时建议先去掉尾部空白再比对。
脱字符在字符类里写在首位是取反,不是锚点。同一个符号两种含义,取决于它在方括号内还是方括号外,写模式时最容易混淆的正是这一处。