跳到主要内容

JavaScript 正则表达式

提示
  1. JavaScript 正则表达式基础:正则表达式是用于定义搜索模式的对象,可以创建和使用来匹配字符串。
  2. 正则表达式的创建和应用:使用正则表达式字面量或 RegExp() 构造函数创建正则表达式,运用 yield 关键字暂停和继续执行函数。
  3. 正则表达式的特殊字符和方法:利用元字符和特殊序列指定模式,并使用 test()exec() 等方法与字符串进行匹配操作。

在 JavaScript 中,正则表达式(RegEx)是描述用于定义搜索模式的字符序列的对象。例如,

/^a...s$/;

上述代码定义了一个正则表达式模式。该模式是:以 a 开头并以 s 结尾的任意五个字母的字符串

使用 RegEx 定义的模式可以用来匹配字符串。

表达式字符串匹配?
/^a...s$/abs不匹配
alias匹配
abyss匹配
Alias不匹配
An abacus不匹配

创建 RegEx

有两种方法可以在 JavaScript 中创建正则表达式。

  1. 使用正则表达式字面量: 正则表达式由两个斜杠 / 之间的模式组成。例如,
const regularExp = /abc/;

这里,/abc/ 是一个正则表达式。

  1. 使用 RegExp() 构造函数: 您还可以通过调用 RegExp() 构造函数来创建正则表达式。例如,
const reguarExp = new RegExp("abc");

例如,

const regex = new RegExp(/^a...s$/);
console.log(regex.test("alias")); // true

在上述示例中,字符串 alias 与 RegEx 模式 /^a...s$/ 匹配。这里使用了 test() 方法来检查字符串是否符合模式。

还有其他一些方法可用于 JavaScript RegEx。在我们探索它们之前,让我们了解有关正则表达式本身。

如果您已经了解了 RegEx 的基础知识,请跳转到 JavaScript RegEx 方法

使用 RegEx 指定模式

为了指定正则表达式,使用了元字符。在上述示例 (/^a...s$/) 中,^$ 是元字符。

元字符

元字符是正则表达式引擎特殊解释的字符。以下是元字符列表:

[] . ^ $ * + ? () \ |

**[]** - 方括号

方括号指定您希望匹配的一组字符。

表达式字符串匹配?
[abc]a1 次匹配
ac2 次匹配
Hey Jude不匹配
abc de ca5 次匹配

这里,[abc] 将匹配您试图匹配的字符串中包含任何 abc

您还可以在方括号内使用 - 指定字符范围。

[a-e][abcde] 相同。

[1-4][1234] 相同。

[0-39][01239] 相同。

您可以通过在方括号开始处使用脱字符号 ^ 来补充(反转)字符集。

[^abc] 表示除 abc 之外的任何字符。

[^0-9] 表示任何非数字字符。

. - 句点

句点匹配任意单个字符(除换行符 '\n')。

表达式字符串匹配?
..a不匹配
ac1 次匹配
acd1 次匹配
acde2 次匹配(包含 4 个字符)

**^** - 脱字符

脱字符 ^

^ 符号用于检查字符串是否以某个特定字符开始

表达式字符串匹配?
^aa1 次匹配
abc1 次匹配
bac无匹配
^ababc1 次匹配
acb无匹配(以 a 开始但不是紧跟着 b

**$** - 美元符号

美元符号 $ 用于检查字符串是否以某个特定字符结尾

表达式字符串匹配?
a$a1 次匹配
formula1 次匹配
cab无匹配

***** - 星号

星号 * 匹配其左侧模式的零次或多次出现

表达式字符串匹配?
ma*nmn1 次匹配
man1 次匹配
mann1 次匹配
main无匹配(a 后面没有跟着 n
woman1 次匹配

**+** - 加号

加号 + 匹配其左侧模式的一次或多次出现

表达式字符串匹配?
ma+nmn无匹配(没有 a 字符)
man1 次匹配
mann1 次匹配
main无匹配(a 后面没有跟着 n
woman1 次匹配

**?** - 问号

问号 ? 匹配其左侧模式的零次或一次出现

表达式字符串匹配?
ma?nmn1 次匹配
man1 次匹配
maan无匹配(超过一个 a 字符)
main无匹配(a 后面没有跟着 n
woman1 次匹配

**{}** - 大括号

考虑这段代码:{n,m}。这表示其左侧模式至少出现 n 次,最多出现 m 次。

表达式字符串匹配?
a{2,3}abc dat无匹配
abc daat1 次匹配(在 daat 处)
aabc daaat2 次匹配(在 aabcdaaat 处)
aabc daaaat2 次匹配(在 aabcdaaaat 处)

再试一个例子。这个正则表达式 [0-9]{2, 4} 匹配至少 2 位数字但不超过 4 位数字。

表达式字符串匹配?
[0-9]{2,4}ab123csde1 次匹配(在 ab123csde 处)
12 and 3456733 次匹配(12345673

| `1 and

2` | 无匹配 |

**|** - 竖线

竖线 | 用于选择性匹配(or 运算符)。

| 表达式 | 字符串 | 匹配? | | -------- | -------------------------- | ------ | ------ | | a | b | cde | 无匹配 | | ade | 1 次匹配(在 ade 处) | | acdbea | 3 次匹配(在 acdbea 处) |

这里,a|b 匹配任何包含 ab 的字符串。

**()** - 括号

圆括号 () 用于对子模式进行分组。例如,(a|b|c)xz 匹配任何以 abc 开始并紧接着 xz 的字符串。

| 表达式 | 字符串 | 匹配? | | ----------- | ---------------------------------- | ------ | ------- | ------ | | (a | b | c)xz | ab xz | 无匹配 | | abxz | 1 次匹配(在 abxz 处) | | axz cabxz | 2 次匹配(在 axzcabxz 处) |

**\** - 反斜杠

反斜杠 \ 用于转义各种字符,包括所有元字符。例如,

\$a 匹配包含 $ 后跟 a 的字符串。在这里,$ 不会被正则表达式引擎以特殊方式解释。

如果你不确定一个字符是否具有特殊意义,你可以在它前面加上 \。这确保了该字符不会以特殊方式处理。

特殊序列

特殊序列使常用模式更容易编写。以下是特殊序列的列表:

\A - 如果指定字符在字符串的开始处匹配。

表达式字符串匹配?
\Athethe sun匹配
In the sun无匹配

\b - 如果指定字符在单词的开头或结尾匹配。

表达式字符串匹配?
\bfoofootball匹配
a football匹配
foo\ba football无匹配
the foo匹配
the afoo test匹配
the afootest无匹配

\B - \b 的相反。如果指定字符不在单词的开头或结尾匹配。

表达式字符串匹配?
\Bfoofootball无匹配
a football无匹配
foo\Ba football匹配
the foo无匹配
the afoo test无匹配
the afootest匹配

\d - 匹配任何十进制数字。等同于 [0-9]

表达式字符串匹配?
\d12abc33 次匹配(在 12abc3 处)
JavaScript无匹配

\D - 匹配任何非十进制数字。等同于 [^0-9]

表达式字符串匹配?
\D1ab34"503 次匹配(在 1ab34"50 处)
1345无匹配

\s - 匹配字符串中的任何空白字符。等同于 [ \t\n\r\f\v]

表达式字符串匹配?
\sJavaScript RegEx1 次匹配
JavaScriptRegEx无匹配

\S - 匹配字符串中的任何非空白字符。等同于 [^ \t\n\r\f\v]

表达式字符串匹配?
\Sa b2 次匹配(在 ab 处)
 无匹配

\w - 匹配任何字母数字字符(数字和字母)。等同于 [a-zA-Z0-9_]。顺便说一下,下划线 _ 也被视为字母数字字符。

表达式字符串匹配?
\w12&": ;c3 次匹配(在 12&": ;c 处)
%"> !无匹配

\W - 匹配任何非字母数字字符。等同于 [^a-zA-Z0-9_]

表达式字符串匹配?
\W1a2%c1 次匹配(在 1a2%c 处)
JavaScript无匹配

\Z - 如果指定字符位于字符串的末尾,则匹配。

表达式字符串匹配?
JavaScript\ZI like JavaScript1 次匹配
I like JavaScript Programming无匹配
JavaScript is fun无匹配

提示:要构建和测试正则表达式,可以使用如 regex101 的正则表达式测试工具。这个工具不仅帮助你创建正则表达式,还帮助你学习它。

现在您已经了解了 RegEx 的基础知识,让我们讨论如何在 JavaScript 代码中使用 RegEx。

JavaScript 正则表达式方法

如上所述,你可以使用 RegExp() 或正则表达式字面量在 JavaScript 中创建 RegEx。

const regex1 = /^ab/;
const regex2 = new Regexp("/^ab/");

在 JavaScript 中,你可以使用 RegExp() 方法 test()exec() 与正则表达式一起使用。

还有一些字符串方法允许你将 RegEx 作为其参数传递。它们包括:match()replace()search()split()

方法描述
exec()在字符串中执行匹配搜索并返回信息数组。不匹配时返回 null。
test()测试字符串中的匹配项并返回 true 或 false。
match()返回包含所有匹配项的数组。不匹配时返回 null。
matchAll()返回包含所有匹配项的迭代器。
search()测试字符串中的匹配项并返回匹配的索引。搜索失败时返回 -1。
replace()在字符串中搜索匹配项并用替换子字符串替换匹配的子字符串。
split()将字符串拆分为子字符串数组。

示例 1:正则表达式

const string = 'Find me';
const pattern = /me/;

// 搜索字符串变量中的模式
const result1 = string.search(pattern);
console.log(result1); // 5

// 将字符替换为另一个字符
const string1 = 'Find me';
string1.replace(pattern, 'found you'); // Find found you

// 将字符串拆分为数组元素
const regex

1 = /[\s,]+/;
const result2 = 'Hello world! '.split(regex1);
console.log(result2); // ['Hello', 'world!', '']

// 搜索电话号码模式
const regex2 = /(\d{3})\D(\d{3})-(\d{4})/g;
const result3 = regex2.exec('My phone number is: 555 123-4567.');
console.log(result3); // ["555 123-4567", "555", "123", "4567"]

正则表达式标志

标志用于正则表达式,允许各种选项,如全局搜索、不区分大小写的搜索等。它们可以单独或一起使用。

标志描述
g执行全局匹配(查找所有匹配项)
m执行多行匹配
i执行不区分大小写的匹配

示例 2:正则表达式修饰符

const string = "Hello hello hello";

// 执行替换
const result1 = string.replace(/hello/, "world");
console.log(result1); // Hello world hello

// 执行全局替换
const result2 = string.replace(/hello/g, "world");
console.log(result2); // Hello world world

// 执行不区分大小写的替换
const result3 = string.replace(/hello/i, "world");
console.log(result3); // world hello hello

// 执行全局不区分大小写的替换
const result4 = string.replace(/hello/gi, "world");
console.log(result4); // world world world

示例 3:验证电话号码

// 程序验证电话号码

function validatePhone(num) {
// 电话号码的正则表达式模式
const re = /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/g;

// 检查电话号码是否有效
let result = num.match(re);
if (result) {
console.log("电话号码有效。");
} else {
let num = prompt("请输入 XXX-XXX-XXXX 格式的号码:");
validatePhone(num);
}
}

// 获取输入
let number = prompt("输入电话号码 XXX-XXX-XXXX");

validatePhone(number);

输出

输入电话号码 XXX-XXX-XXXX: 2343223432
请输入 XXX-XXX-XXXX 格式的号码:234-322-3432
电话号码有效

示例 4:验证电子邮箱地址

// 程序验证电子邮箱地址

function validateEmail(email) {
// 电子邮箱的正则表达式模式
const re = /\S+@\S+\.\S+/g;

// 检查电子邮箱是否有效
let result = re.test(email);
if (result) {
console.log("电子邮箱有效。");
} else {
let newEmail = prompt("请输入有效的电子邮箱:");
validateEmail(newEmail);
}
}

// 获取输入
let email = prompt("输入电子邮箱:");

validateEmail(email);

输出

输入电子邮箱:hellohello
请输入有效的电子邮箱:learningJS@gmail.com
电子邮箱有效。