Skip to content

JavaScript 正则表达式

正则表达式 (RegExp) 是一个描述字符序列的对象,用于在字符串中进行模式匹配。它们是强大的文本搜索和替换工具。

正则表达式定义了一个搜索模式。这个模式可以是一个简单的单个字符,也可以是定义文本中特定结构的复杂序列。

正则表达式用于执行各种文本操作,包括:

  • 搜索特定的文本模式。
  • 替换匹配模式的文本。
  • 验证输入(例如,电子邮件格式、密码)。
  • 从字符串中提取信息。

正则表达式可以通过两种方式创建:

  1. 字面量表示法 (Literal Notation): /pattern/flags const regexLiteral = /w3schools/i;

  2. 构造函数 (Constructor): new RegExp("pattern", "flags") const regexConstructor = new RegExp(“w3schools”, “i”);

示例解释 (/w3schools/i):

  • w3schools 是要搜索的模式。
  • i 是一个标志(修饰符),使搜索不区分大小写。

当模式是常量时,通常优先选择字面量表示法以获得更好的性能。

将字符串方法与正则表达式一起使用

Section titled “将字符串方法与正则表达式一起使用”

JavaScript 的 String 对象有几个与正则表达式一起使用的方法:

  • search(regexp): 搜索匹配项并返回第一个匹配项的索引,如果未找到则返回 -1。
  • replace(regexp|substr, newSubstr|function): 用新子字符串或函数结果替换匹配项。
  • match(regexp): 返回包含匹配项的数组,如果未找到匹配项则返回 null。行为会随 g 标志而改变。
  • matchAll(regexp) (ES2020): 返回所有匹配项的迭代器,包括捕获组。需要 g 标志。
  • split(separator, limit): 将字符串拆分为子字符串数组,可以使用 RegExp 作为分隔符。
const text = "Visit W3Schools online!";
const pattern = /w3schools/i;
const position = text.search(pattern);
console.log(position); // Output: 6 (index of 'W')

如果将字符串传递给 search(),它会被隐式转换为 RegExp:text.search("W3Schools")。

const originalText = "Visit Microsoft! Microsoft is great.";
const newText = originalText.replace(/microsoft/ig, "W3Schools");
console.log(newText); // Output: "Visit W3Schools! W3Schools is great."
// 'i' for case-insensitive, 'g' for global (replace all occurrences)

你也可以使用字符串作为第一个参数进行简单替换:originalText.replace("Microsoft", "W3Schools")(只替换第一个匹配项)。

标志改变正则表达式搜索的行为:

标志描述
i忽略大小写: 执行不区分大小写的匹配。
g全局搜索: 查找所有匹配项,而不是在找到第一个匹配项后停止。
m多行模式: 锚点 ^ 和 $ 匹配行的开始/结束,而不仅仅是字符串的开始/结束。
sdotall 模式 (ES2018): 允许 . 匹配换行符 (\n)。
uUnicode 模式 (ES6): 启用更广泛的 Unicode 支持,包括匹配 astral 符号和正确处理模式中的 Unicode 转义序列。
y粘性模式 (ES6): 只从目标字符串的 lastIndex 位置开始匹配,并且不会尝试从任何后续位置匹配。

方括号定义字符集:

表达式描述
[abc]查找方括号之间的任意一个字符 (a, b, or c)。
[^abc]查找不在方括号之间的任意字符。
[0-9]查找任意数字从 0 到 9。
[a-z]查找任意小写字母从 a 到 z。
(x|y)或 (Alternation): 查找 ‘x’ 或 ‘y’。

元字符是具有特殊含义的字符:

元字符描述
.匹配除换行符外的任意单个字符(除非使用 s 标志)。
\d查找数字。等同于 [0-9]。
\D查找非数字字符。
\s查找空白字符(空格、制表符、换行符等)。
\S查找非空白字符。
\w查找单词字符(字母数字加下划线)。等同于 [A-Za-z0-9_]。
\W查找非单词字符。
\b在单词边界处查找匹配项(单词字符与非单词字符之间的位置)。
\B在非单词边界处查找匹配项。
\n匹配换行符。
\t匹配制表符。
\uxxxx查找由十六进制数 xxxx 指定的 Unicode 字符。

量词定义字符、组或字符类可以出现的次数:

量词描述
n+匹配包含至少一个 n 的任意字符串。
n*匹配包含零个或多个 n 的任意字符串。
n?匹配包含零个或一个 n 的任意字符串。
n{X}匹配包含 X 个 n 的任意字符串。
n{X,Y}匹配包含介于 X 和 Y 个 n 之间的任意字符串。
n{X,}匹配包含至少 X 个 n 的任意字符串。

有关 RegExp 模式的全面指南,请参考 MDN Web Docs 或专门的正则表达式教程。

RegExp 对象本身有用于执行匹配的方法:

test(string): 在字符串中搜索模式。如果找到匹配项则返回 true,否则返回 false。

const patternTest = /e/;
const resultTest = patternTest.test("The best things in life are free!");
console.log(resultTest); // true

exec(string): 在字符串中搜索指定的模式并返回包含匹配信息的数组(如果未匹配则返回 null)。如果使用了全局标志 (g),exec() 可以多次调用以查找连续的匹配项,更新 RegExp 对象的 lastIndex 属性。

const patternExec = /b(est)/;
const resultExec = patternExec.exec("The best things in life are free!");
console.log(resultExec);
// Output: ["best", "est", index: 4, input: "The best things in life are free!", groups: undefined]
// resultExec[0] is the full match, resultExec[1] is the first captured group.

现代 JavaScript 允许为捕获组命名,以提高可读性:

const datePattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const match = datePattern.exec("2023-10-26");
if (match && match.groups) {
console.log(match.groups.year); // "2023"
console.log(match.groups.month); // "10"
console.log(match.groups.day); // "26"
}

正则表达式是一个深入且强大的主题。如需完整的参考和更多高级特性,请查阅 MDN Web Docs 上关于 JavaScript 正则表达式的文档,并探索在线 RegExp 测试工具和教程。