JavaScript 正则表达式

本文档介绍了JavaScript正则表达式的使用,包括创建正则表达式的方法、元字符、特殊序列以及各种匹配操作。通过示例展示了如何验证电话号码和电子邮件地址,深入理解JavaScript中的搜索和替换操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    在本教程中,您将借助示例了解 JavaScript 正则表达式 (Regex)。
    在 JavaScript 中,正则表达式( RegEx ) 是描述用于定义搜索模式的字符序列的对象。例如,

/^a...s$/

    上面的代码定义了一个 RegEx 模式。模式是:任何以 a 开头、以 s 结尾的五个字母字符串。
    使用 RegEx 定义的模式可用于匹配字符串。

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

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

  1. 使用正则表达式字面量:
        正则表达式由一个包含在斜杠 / 之间的模式组成。例如,
cost 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 的基础知识,请跳转到 JavaScript RegEx 方法。

使用正则表达式指定模式

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

元字符

    元字符是由 RegEx 引擎以特殊方式解释的字符。以下是元字符列表:
    [] . ^ $ * + ? {} () \ |

[] - 方括号

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

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

    这里,[abc] 将匹配您试图匹配的字符串是否包含 a、b 或 c 中的任何一个。
    还可以使用方括号内的 - 指定字符范围。
    [a-e] 与 [abcde] 是一样的。
    [1-4] 与 [1234] 是一样的。
    [0-39] 与 [01239] 是一样的。
    您可以在方括号的开头使用插入符号 ^ 来补充(反转)字符集。
    [^abc] 表示除 a 或 b 或 c 之外的任何字符。
    [^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个匹配项
aabc daaat2个匹配项
aabc daaaat2 个匹配项

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

表达式字符串匹配?
[0-9]{2,4}ab123csde1个匹配项
12 and 3456733个匹配项
1 and 2不匹配
| - 交替

    竖条 | 用于交替(or 操作符)

表达式字符串匹配?
a|bcde不匹配
ade1个匹配项
acdbea3个匹配项

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

() - 组

    括号 () 用于分组子模式。例如,(a|b|c)xz 匹配 a 或 b 或 c 后跟 xz 的字符串。

表达式字符串匹配?
(a|b|c)xzab xz不匹配
abxz1个匹配项
axz cabxz2个匹配项
\ - 反斜杠

    反斜杠 \ 用于转义各种字符,包括所有元字符。例如,
    如果字符串包含 $ 并后跟 \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个匹配项
JavaScript不匹配

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

表达式字符串匹配?
\D1ab34"503个匹配项
1345不匹配

    \s - 匹配字符串包含任何空白字符的位置。相当于 [ \t\n\r\f\v] 。

表达式字符串匹配?
\sJavaScript RegEx1个匹配项
JavaScriptRegEx不匹配

    \S - 匹配字符串包含任何非空白字符的位置。相当于 [^ \t\n\r\f\v]。

表达式字符串匹配?
\Sa b2个匹配项
不匹配

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

表达式字符串匹配?
\w12&": ;c3个匹配项
%"> !不匹配

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

表达式字符串匹配?
\W1a2%c1个匹配项
JavaScript不匹配

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

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

    提示:要构建和测试正则表达式,您可以使用 RegEx 测试工具,例如 regex101。该工具不仅可以帮助您创建正则表达式,还可以帮助您学习它。
    现在您了解了正则表达式的基础知识,让我们讨论如何在 JavaScript 代码中使用正则表达式。

JavaScript 正则表达式方法

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

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

    在 JavaScript 中,可以将正则表达式与 RegExp() 方法一起使用,RegExp() 方法包括 test() 和 exec()。
    还有一些字符串方法允许您将正则表达式作为其参数传递。它们是:match(),replace(),search() 和 split()。

方法描述
exec()在字符串中执行匹配项搜索并返回信息数组。不匹配时返回 null。
test()测试字符串的匹配并返回真或假。
match()返回一个包含所有匹配项的数组。不匹配时返回 null。
matchAll()返回包含所有匹配项的迭代器。
search()测试字符串中的匹配并返回匹配的索引。如果搜索失败,则返回 -1。
replace()在字符串中搜索匹配项并将匹配的子字符串替换为子字符串。
split()将字符串分解为子字符串数组。
示例 1:正则表达式
const string = 'Find me';
const pattern = /me/;

// search if the pattern is in string variable
const result1 = string.search(pattern);
console.log(result1); // 5

// replace the character with another character
const string1 = 'Find me';
string1.replace(pattern, 'found you'); // Find found you

// splitting strings into array elements
const regex1 = /[\s,]+/;
const result2 = 'Hello world! '.split(regex1);
console.log(result2); // ['Hello', 'world!', '']

// searching the phone number pattern
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';

// performing a replacement
const result1 = string.replace(/hello/, 'world');
console.log(result1); // Hello world hello

// performing global replacement
const result2 = string.replace(/hello/g, 'world');
console.log(result2); // Hello world world

// performing case-insensitive replacement
const result3 = string.replace(/hello/i, 'world');
console.log(result3); // world hello hello

// performing global case-insensitive replacement
const result4 = string.replace(/hello/gi, 'world');
console.log(result4); // world world world
示例 3:验证电话号码
// program to validate the phone number

function validatePhone(num) {

    // regex pattern for phone number
    const re = /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/g;

    // check if the phone number is valid
    let result = num.match(re);
    if (result) {
        console.log('The number is valid.');
    }
    else {
        let num = prompt('Enter number in XXX-XXX-XXXX format:');
        validatePhone(num);
    }
}

// take input
let number = prompt('Enter a number XXX-XXX-XXXX');

validatePhone(number);

    输出

Enter a number XXX-XXX-XXXX: 2343223432
Enter number in XXX-XXX-XXXX format: 234-322-3432
The number is valid
示例 4:验证电子邮件地址
// program to validate the email address

function validateEmail(email) {

    // regex pattern for email
    const re = /\S+@\S+\.\S+/g;

    // check if the email is valid
    let result = re.test(email);
    if (result) {
        console.log('The email is valid.');
    }
    else {
        let newEmail = prompt('Enter a valid email:');
        validateEmail(newEmail);
    }
}

// take input
let email = prompt('Enter an email: ');

validateEmail(email);

    输出

Enter an email: hellohello
Enter a valid email: learningJS@gmail.com
The email is valid.

    上一教程JS Generators                                          下一教程JS Debugging

参考文档

[1] Parewa Labs Pvt. Ltd. (2022, January 1). Getting Started With JavaScript, from Parewa Labs Pvt. Ltd: https://www.programiz.com/javascript/regex

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值