JavaScript 正则表达式简介

2025-06-08

JavaScript 正则表达式简介

这篇文章最初发表在attacomsian.com/blog上。


正则表达式(也称为regexregexp)是定义搜索模式的字符序列。这些搜索模式通常用于文本搜索文本搜索和替换数据提取以及输入验证操作。

与其他编程语言一样,JavaScript 也支持使用正则表达式对字符串执行模式匹配和搜索替换功能。JavaScript 将正则表达式视为具有预定义属性和方法的对象。

句法

正则表达式可以由一个或多个元字符和文字字符组成。

/pattern/modifiers;

例如,/javascript/i是一个正则表达式,其中javascript是搜索模式,i是修饰符。

创建正则表达式

在 JavaScript 中,可以通过两种方式创建正则表达式:使用正则表达式文字或调用构造函数RegExp来初始化新对象。

var re1 = /java+script/g;
var re2 = new RegExp('java+script', 'g');

正则表达式的字面形式在脚本加载时会被编译。如果模式保持不变,则正则表达式字面形式在性能方面会更胜一筹。

另一方面,使用构造函数创建的正则表达式在运行时进行编译,并且仅应在确定模式是动态时使用。

测试正则表达式

您可以使用对象test()的方法RegExp来快速测试正则表达式。此方法执行搜索,以查找正则表达式与指定字符串之间的匹配项。true如果找到匹配项,则返回 ,否则返回false

var re = /java+script/gi;
re.test('javascript'); // true
re.test('JavaScript is a client side programming language'); // true
re.test('java'); // false

测试正则表达式的另一种方法是使用对象exec()的方法RegExp。它在目标字符串中搜索匹配项,如果找到则返回一个数组,否则返回null

/^The/.exec('The Apple')
// ["The", index: 0, input: "The Apple", groups: undefined]

正则表达式修饰符

修饰符(也称为标志)是特殊字符,可用于执行不区分大小写的更高级搜索。

  • i执行不区分大小写的匹配
  • g执行全局匹配(找到第一个匹配后不会停止,并找到所有可能的匹配)
  • m执行多行匹配
  • u启用 unicode 字符匹配(ES6 中引入)
  • s(也称为“dotAll”)允许.匹配换行符(在 ES9 中引入)

可以组合标志来执行复杂的匹配操作:

var re1 = /java+script/gi;
var re2 = new RegExp('java+script', 'gi');

正则表达式模式

正则表达式模式由简单字符(例如 )/javascript/或简单字符和特殊字符(例如 )的组合组成/java*script/。简单字符用于直接匹配。例如,/bcd/仅当字符“bcd”完全同时出现且顺序完全相同时,简单模式才会匹配字符串中的字符组合。

/bcd/g.test('Who is this bcd?') // exact match substring bcd

特殊字符用于匹配比文字字符串更广泛的值。例如,要匹配单个“a”后跟一个或多个“b”,再后跟“d”,我们可以使用模式/ab+d/+“b”后的表示“前一项出现一次或多次”。

/ab+d/g.test('aabbbdccbbbd') // match substring abbbd

下表提供了特殊字符的完整列表以及可在正则表达式中使用的示例:

断言

断言表明某种情况下匹配是可能的。断言包括前瞻后瞻条件表达式

?字符也可用作量词。

人物 例子 描述
x(?=y) /Atta(?=shah)/ 前瞻断言。x仅当其后跟 时才匹配y
x(?!y) /\d+(?!\.)/ 负向前瞻断言。x仅当其后不跟 时才匹配y
(?<=y)x /(?<=shah)Atta/ 后视断言。x仅当其前面有 时才匹配y
(?<!y)x /(?<!-)\d+/ 负向后视断言。x仅当其前面没有 时才匹配y

在断言中,只有x是匹配的一部分。例如,/Europe+(?=Germany|France)/只有当“Europe”后面跟着“Germany”或“France”时,才会匹配“Europe”。但是,“Germany”和“France”都不包含在匹配结果中。

/Europe+(?=Germany|France)/.test('EuropeGermany') // matches "EuropeGermany"
/(?<!-)\d+/.test('45.99') // matches "45"

边界

边界表示行和单词的开始和结束。

人物 例子 描述
^ /^An/ 匹配输入的开始
$ /App$/ 匹配输入的结尾
\b /un\b/ 匹配单词边界
\B /\Bon/ 匹配非单词边界
/^An/.test('An Apple') // matches "An"
/App$/.test('Mobile App') // matches "App" 
/un\b/.test('Sun') // matches "un"
/\Bon/.test('Moon') // matches "on"

组和范围

组和范围对于查找字符范围很有用。

  • (x|y)匹配xy。例如,/(green|red)/匹配“red bull”中的“red”。
  • [abcd]匹配任意一个括起来的字符。相当于[a-d]
  • [^abcd]不匹配任何括起来的字符。相当于[^a-d]
  • [0-9]匹配任意一个括起来的字符(任意数字)。
  • [^0-9]不匹配任何括起来的字符(任何非数字)。
/[a-z]/.exec('a2') // matches "a"
/[0-9]/.exec('a2') // matches "2"
/[a-z0-9]/.exec('$a2') // matches "a"

角色类别

字符类(也称为元字符)是具有特殊含义的字符,用于区分不同类型的字符。例如,区分字母和数字。

人物 例子 描述
. /.s/ 匹配任意单个字符,除换行符或行终止符之外
\w /\w/ 匹配任意字母数字字符(包括下划线)。相当于[A-Za-z0-9_]
\W /\W/ 匹配任意非字母数字字符。相当于[^A-Za-z0-9_]
\d /\d/ 匹配任意数字。等同于[0-9]
\D /\D/ 匹配任意非数字字符。等同于[^0-9]
\s /\s/ 匹配单个空白字符
\S /\S/ 匹配除空格之外的单个字符
\t /\t/ 匹配制表符
\n /\n/ 匹配换行符
\0 /\0/ 匹配 NUL 字符
\uxxxx /\uxxxx/ 匹配一个 Unicode 字符
/.s/.test('yes') // matches "es"
/\d/.test('3D') // matches "3"
/\w/.test('$9.99') // matches "9"
/\W/.test('45%') // matches "%"

量词

量词定义数量并指示要匹配的字符或表达式的数量。

人物 例子 描述
n+ /ab+/ 匹配至少包含一个n
n* /ab*/ 匹配包含零次或多次出现的任意字符串n
n? /ab?/ 匹配包含零个或一个n
n{x} /a{2}/ 精确匹配x前一项的出现n
n{x,} /a{2, }/ 至少匹配x前一项的出现次数n
n{x,y} /a{1,3}/ 至少匹配前一个项目的出现次数x,最多y匹配前一个项目的出现次数n
/ab+/.test('abbcdab') // matches "abb"
/bb*/.test('abbcdab') // matches "bb"
/b{2,}/.test('abbcdab') // matches "bb"
/a{1,3}/.test('bbcdaaab') // matches "aaa"

正则表达式转义

如果要将任何特殊字符用作字面值(例如搜索“+”),则需要在它们前面加上反斜杠进行转义。例如,要搜索“a”后接“+”,再接“c”,则可以使用/a\+b/。反斜杠会“转义”“+”,使其成为字面值,而不是特殊字符。

/\d\+\d/.test('2+2') // true
/\$\d/.test('$2.49') // true

正则表达式用法

RegExp在 JavaScript 中,正则表达式与的对象方法exec()一起使用test(),以及 的match()replace()search()split()方法一起使用String

var str = "JavaScript is a client-side programming language";
str.search(/client/i)
//16 (the starting position of "client")
str.replace(/client/i, 'server')
//JavaScript is a server-side programming language
str.match(/client/i)
//["client", index: 16]
str.split(/\s/i)
//["JavaScript", "is", "a", "client-side", "programming", "language"]

以上只是使用正则表达式进行搜索和替换操作的几个示例。它们也用于 JavaScript 中的输入验证和数据提取:

// extract number from a string
'I paid $45.99'.match(/\d+\.*\d*/) //["45.99", index: 8]

// validate date in dd-mm-yyyy format
/(\d{2})-(\d{2})-(\d{2,4})/.test('23-12-89') // true

✌️ 我撰写有关现代 JavaScript、Node.js、Spring Boot以及所有Web 开发方面的文章。订阅我的新闻通讯,每周获取 Web 开发教程和专业技巧。


喜欢这篇文章吗? 请在 Twitter 上关注 @attacomsian。你也可以在LinkedInDEV上关注我。

鏂囩珷鏉ユ簮锛�https://dev.to/attacomsian/introduction-to-javascript-regular-expressions-49e2
PREV
XMLHttpRequest(XHR)简介
NEXT
JavaScript 箭头函数简介