^和$默认锚定整个字符串首尾,启用m标志后按换行符划分多行并分别锚定每行首尾;$匹配行尾位置(换行符前),不匹配换行符本身。

在 JavaScript 正则表达式中,^ 和 $ 是行首与行尾的边界匹配符,但它们的“定位逻辑”取决于是否启用 m(multiline)标志。默认情况下(无 m),它们只匹配整个字符串的开头和结尾;开启 m 后,则按换行符(\n、\r\n 等)划分“行”,并在每行的起始和结束位置生效。
默认模式(无 m 标志):只锚定整个字符串
此时 ^ 只匹配字符串最开头的位置,$ 只匹配字符串最末尾(不包括末尾换行符之后)。即使字符串含多行,也不会为中间换行符两侧额外创建匹配点。
-
/^abc$/.test("abc")→true -
/^abc$/.test("abc\nxyz")→false(整个字符串不是纯 "abc") -
/^abc$/.test("abc\n")→false(末尾有换行符,$ 不匹配 \n 前的位置,除非用\s*$或显式包含\n)
多行模式(启用 m 标志):按行锚定
添加 m 标志后,^ 匹配每个换行符后的第一个字符位置(以及字符串开头),$ 匹配每个换行符前的位置(以及字符串结尾)。注意:它识别的是 \n、\r\n、\r、\u2028、\u2029 这些 Unicode 行终止符。
-
/^abc$/m.test("abc\nxyz")→true(第一行是 "abc") -
/"^abc$/gm.test("abc\nxyz\nabc")→ 匹配两次(第1行和第3行) -
/^abc$/m.test("\nabc")→true(\n 后是 abc,^ 匹配 \n 后位置)
注意 $ 的“末尾”不包含换行符本身
$ 匹配的是“行尾位置”,不是换行符字符。也就是说,它位于换行符 之前,而非之后。若需匹配到换行符,应显式写 $\n 或使用 \r?\n 等组合;若想让 $ 也匹配字符串末尾的换行符位置,可配合 \s*$ 或使用 \z(但 JS 不支持 \z,只能靠逻辑绕过)。
-
/$/.exec("abc\n")→ 匹配位置是索引 3("abc" 末尾,\n 前) -
/\n$/.exec("abc\n")→null(因为 $ 在 \n 前,而 \n 是独立字符) - 要匹配“以换行符结尾的行”,常用
/abc\r?\n$/m或更健壮的/abc(?=\r?\n|$)/
与 \A 和 \Z 的区别(JS 中不可用)
JavaScript 不支持 \A(绝对字符串开头)和 \Z(绝对字符串结尾,允许末尾一个换行符)这类更严格的锚点。因此,在 JS 中必须靠 m 标志 + 显式换行处理,或结合 ^/$ 与字符串方法(如 split('\n'))来模拟精确行处理逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











