Skip to content
本页目录

内置对象 RegExp

什么是 RegExp?

RegExp(正则表达式)是一种用于匹配和操作字符串模式的强大工具。它是一种模式匹配的语法,可以用来搜索、替换和提取字符串中的特定部分。在 JavaScript 中,RegExp 是一个内置的对象类型,可以通过字面量或构造函数来创建。

正则表达式是一种由字符和特殊符号组成的模式,用于定义字符串的搜索规则。在 JavaScript 中,可以使用正则表达式执行以下操作:

  • 匹配(Matching):使用正则表达式来检查字符串是否符合特定模式。
  • 搜索(Searching):使用正则表达式在字符串中查找特定模式的出现位置。
  • 替换(Replacing):使用正则表达式来查找匹配的模式,并进行替换操作。

当涉及到字符串模式匹配和替换时,JavaScript 的正则表达式(Regular Expression)提供了强大的工具。正则表达式是一种描述字符串模式的表达式,它可以用来检查、匹配、搜索和替换字符串。下面是关于 JavaScript 正则表达式的详细介绍。

正则表达式基础语法

在 JavaScript 中,正则表达式可以使用字面量形式或构造函数形式来创建。

字面量形式

使用斜杠(/)将正则表达式模式包围起来,后面可以跟上一些修饰符(如 gim)。

javascript
const pattern = /abc/

构造函数形式

使用 RegExp 构造函数创建正则表达式,它接收两个参数:模式字符串和可选的修饰符字符串。

javascript
const pattern = new RegExp('abc')

元字符

  • .:匹配除换行符之外的任何单个字符。
  • ^:匹配字符串的开头。
  • $:匹配字符串的结尾。
  • \*:匹配前面的元素零次或多次。
  • +:匹配前面的元素一次或多次。
  • ?:匹配前面的元素零次或一次。
  • []:定义字符类,匹配括号内的任意字符。
  • ():标记子表达式的开始和结束位置,并捕获匹配的子字符串。

正则表达式修饰符

修饰符用于在正则表达式中添加额外的规则,影响匹配的行为。以下是常用的修饰符:

  • g:全局匹配,找到所有匹配项而不仅仅是第一个。
  • i:不区分大小写匹配。
  • m:多行匹配,允许 ^$ 来匹配字符串的开始和结束。
javascript
const pattern = /abc/gi

常用的正则表达式模式

以下是一些常用的正则表达式模式示例:

  • 匹配字母或数字字符/[a-zA-Z0-9]/
  • 匹配多个字母或数字字符/[a-zA-Z0-9]+/
  • 匹配数字/\d/
  • 匹配非数字/\D/
  • 匹配空格字符/\s/
  • 匹配非空格字符/\S/
  • 匹配单词字符/\w/
  • 匹配非单词字符/\W/
  • 匹配邮箱/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/

正则表达式方法

JavaScript 的字符串对象提供了一些与正则表达式相关的方法来执行匹配、搜索和替换操作。

以下是一些常用的方法:

  • match():在字符串中搜索匹配正则表达式的结果,并返回一个数组或 null
  • search():在字符串中搜索匹配正则表达式的结果,并返回第一个匹配的索引,如果没有找到则返回 -1
  • replace():使用新的字符串替换匹配正则表达式的结果,并返回替换后的字符串。
  • test():检查字符串是否匹配正则表达式,并返回 truefalse
  • exec(): 在字符串中执行正则表达式匹配,返回匹配结果的数组或 null。
javascript
const str = 'Hello, World!'
const pattern = /Hello/

console.log(str.match(pattern)) // 输出:['Hello']
console.log(str.search(pattern)) // 输出:0
console.log(str.replace(pattern, 'Hi')) // 输出:'Hi, World!'
console.log(pattern.test(str)) // 输出:true

正则表达式的分组和捕获

正则表达式还支持使用圆括号进行分组和捕获。通过使用圆括号将模式的一部分括起来,可以创建子模式,并将匹配到的子串捕获到一个分组中。

以下是一些常用的分组和捕获的示例:

  • 使用括号进行分组(abc)+ 会匹配一个或多个连续的 "abc"。
  • 捕获分组:使用括号进行分组后,可以通过编号或名称将捕获的子串提取出来。

使用编号访问捕获的子串:

javascript
const str = 'Hello, World!'
const pattern = /(Hello), (World)!/
const match = str.match(pattern)

console.log(match[0]) // 输出:'Hello, World!'
console.log(match[1]) // 输出:'Hello'
console.log(match[2]) // 输出:'World'

使用名称访问捕获的子串:

javascript
const str = 'Hello, World!'
const pattern = /(?<greeting>Hello), (?<subject>World)!/
const match = str.match(pattern)

console.log(match[0]) // 输出:'Hello, World!'
console.log(match.groups.greeting) // 输出:'Hello'
console.log(match.groups.subject) // 输出:'World'

在上述示例中,正则表达式 (Hello), (World)! 使用括号进行分组,并将 "Hello" 和 "World" 捕获到两个分组中。使用编号或名称可以访问捕获的子串。

捕获分组可用于从字符串中提取特定部分的信息,进行更精确的匹配和处理。

正则表达式标志

除了修饰符外,JavaScript 正则表达式还支持标志(Flags),用于提供更多的匹配选项。

以下是常用的正则表达式标志:

  • g:全局匹配,找到所有匹配项而不仅仅是第一个。
  • i:不区分大小写匹配。
  • m:多行匹配,允许 ^$ 来匹配字符串的开始和结束。
  • s:允许点号(.)匹配任意字符,包括换行符。
  • u:启用 Unicode 匹配模式。
  • y:粘附模式,只从上次匹配结束的位置开始匹配。

标志可以通过在正则表达式字面量或构造函数中使用单个字符的方式添加。例如:

javascript
const pattern = /abc/gi
const pattern2 = new RegExp('abc', 'gi')

应用场景

正则表达式在 JavaScript 中具有广泛的应用场景,例如:

  • 表单验证:使用正则表达式验证用户输入的表单数据,如邮箱、电话号码、密码等。
  • 字符串替换:使用正则表达式进行文本替换、格式化或删除特定的字符。
  • 数据提取:使用正则表达式从文本中提取特定的信息,如 URL、日期、数字等。
  • 语法解析:使用正则表达式解析特定的语法或格式,如 Markdown、JSON 等。

正则表达式是 JavaScript 中强大的工具之一,它提供了灵活和高效的字符串处理能力。通过学习和掌握正则表达式的语法和方法,可以提高字符串处理的效率和精确度,从而更好地应对各种字符串操作的需求。

lemon's personal blog.