JavaScript 正则表达式简介
这篇文章最初发表在attacomsian.com/blog上。
正则表达式(也称为regex或regexp)是定义搜索模式的字符序列。这些搜索模式通常用于文本搜索、文本搜索和替换、数据提取以及输入验证操作。
与其他编程语言一样,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)
匹配x
或y
。例如,/(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。你也可以在LinkedIn和DEV上关注我。
鏂囩珷鏉ユ簮锛�https://dev.to/attacomsian/introduction-to-javascript-regular-expressions-49e2