输入边界断言:^, $

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

输入边界断言检查字符串中的当前位置是否是输入边界。输入边界是字符串的开头或结尾;或者,如果设置了 m 标志,则是行的开头或结尾。

语法

正则表达式
^
$

描述

^ 断言当前位置是输入的开头。$ 断言当前位置是输入的结尾。两者都是断言,因此它们不消耗任何字符。

更精确地说,^ 断言左侧字符超出字符串边界;$ 断言右侧字符超出字符串边界。如果设置了 m 标志,则如果左侧字符是行终止符字符,^ 也会匹配;如果右侧字符是行终止符,$ 也会匹配。

除非设置了 m 标志,否则 ^$ 断言仅在模式的边界处才有意义,因为它们左侧或右侧的任何其他字符都必然会导致断言失败。

y 标志不会改变这些断言的含义——另请参阅锚定粘滞标志

示例

删除尾部斜杠

以下示例从 URL 字符串中删除尾部斜杠

js
function removeTrailingSlash(url) {
  return url.replace(/\/$/, "");
}

removeTrailingSlash("https://example.com/"); // "https://example.com"
removeTrailingSlash("https://example.com/docs/"); // "https://example.com/docs"

匹配文件扩展名

以下示例通过匹配始终位于字符串末尾的文件扩展名来检查文件类型

js
function isImage(filename) {
  return /\.(?:png|jpe?g|webp|avif|gif)$/i.test(filename);
}

isImage("image.png"); // true
isImage("image.jpg"); // true
isImage("image.pdf"); // false

匹配整个输入

有时您希望确保您的正则表达式匹配整个输入,而不仅仅是输入的子字符串。例如,如果您正在确定一个字符串是否是有效的标识符,您可以在模式的两端添加输入边界断言

js
function isValidIdentifier(str) {
  return /^[$_\p{ID_Start}][$_\p{ID_Continue}]*$/u.test(str);
}

isValidIdentifier("foo"); // true
isValidIdentifier("$1"); // true
isValidIdentifier("1foo"); // false
isValidIdentifier("  foo  "); // false

此函数在代码生成(使用代码生成代码)时非常有用,因为您可以将有效标识符与其他字符串属性以不同的方式使用,例如使用点表示法而不是方括号表示法

js
const variables = ["foo", "foo:bar", "  foo  "];

function toAssignment(key) {
  if (isValidIdentifier(key)) {
    return `globalThis.${key} = undefined;`;
  }
  // JSON.stringify() escapes quotes and other special characters
  return `globalThis[${JSON.stringify(key)}] = undefined;`;
}

const statements = variables.map(toAssignment).join("\n");

console.log(statements);
// globalThis.foo = undefined;
// globalThis["foo:bar"] = undefined;
// globalThis["  foo  "] = undefined;

规范

规范
ECMAScript® 2026 语言规范
# prod-Assertion

浏览器兼容性

另见