创造性就是发明、实验、成长、冒险、犯规、犯错和享受乐趣。 ——<玛丽·卢·库克>
介绍
匹配字符串或字符串模式,在最常见的情况下,您需要这些来验证电子邮件、用户输入、文件名或大多数类型的输入字符串。虽然有许多模式匹配库和方法 - 一种久经考验的方法是使用正则表达式来定义一组规则,某个字符串必须遵循以匹配该模式。
在 JavaScript
中,RegExp
类用于表示正则表达式,并且可以与一些使匹配模式更容易的方法结合使用。
显然,使用这些的先决条件是正则表达式的知识。如果您不习惯编写它们,您可以随时使用 RegEx
测试网站,
例如 https://regex101.com/
或 https://regexr.com/ - 它们直观地显示您的表达式对给定字符串的影响。
本文中,将研究
JavaScript
中的正则表达式
、RegExp()类
的用法以及exec()
和test()
方法。
先来看一些与实现的方法 String
的对象- match()
,search()
并且 replace()
,正则表达式 RegEx类
可作为一个较短的替代使用。
什么是正则表达式?
在我们深入研究用于使用 RegEx
的 JavaScript API
之前,让我们先来看看正则表达式本身。
正则表达式(缩写正则表达式)是用来匹配字符串或字符的不同组合的字符的图案。您需要遵循某些规则才能形成正确的正则表达式。示例:
[abc]
- 匹配单个字符:a、b 或 c[^abc]
- 匹配除a、b 或 c之外的所有字符[a-z]
- 匹配范围 az中的任何字符\s
- 匹配任何空白字符\w
- 匹配任何单词字符
这些是一些基本的,但它们更常用。正则表达式也支持运算符:
a?
- 运算符?
匹配零个或一个字符a
a*
- 运算符*
匹配零个或多个字符a
a+
- 运算符+
匹配一个或多个字符a
a{n}
- 运算符{n}
精确匹配n
个字符a
,例如,'o{2}'
不能匹配"Bob"
中的'o'
,但是能匹配"food"
中的两个o
a{n, m}
- 运算符{n, m}
匹配字符a
, 最少匹配n
次且最多匹配m
次,例如,"o{1,3}"
将匹配"fooooood"
中的前三个o
\.
- 操作符\
对字符.
进行转义,这意味着字符.
将没有其通常的含义 - 匹配任何字符串 - 但将作为字符匹配.
编写一个正则表达式来检查字符串是否包含 @gmail.com
在字符串的末尾并 a
在 @
符号之前包含三个字符:
1 | "\w+a{3}@gmail\.com" |
RegExp 类
在 JavaScript
中,有两种创建正则表达式的方法:
- 使用
RegEx
字面量,这是一种放置在/
字符之间的模式:
1 | let regex = "/[abc]+/"; |
- 使用
RegExp()
构造函数:
1 | let regex = new RegExp("[abc]+"); |
注意:从 ES6
开始,您还可以将 RegEx
作为构造函数的参数传递
1 | let regex = new RegExp(/[abc]+/); |
使用 RegExp
时,还可以传递标志 - 具有含义的字符 - 改变模式匹配的方式。其中一些标志是:
i
- 表示不区分大小写,所以A
和a
匹配时相同
1 | // Matches both ABC and abc one or more times |
-
g
- 表示将匹配所有可能的情况,而不仅仅是遇到的第一个 -
m
- 表示多行模式,允许模式与多行写入的字符串匹配
1 | let string = ` |
RegExp()
构造仅用于生成图案进行测试。但是,它包含两种方法可以测试模式并在适合时进行匹配:exec()
和 test()
。
exec() 函数
exec()
函数在字符串中执行搜索。如果有匹配项,则返回一个包含匹配项信息的数组,否则返回 null
。
例如检查电子邮件是否以域名结尾 @gmail.com
并包含三个连续的 a
字符 @gmail
。
1 | // 不区分大小写 |
输出
1 | [ 'someEmailaaa@gmail.com', |
exec()
方法的一个有趣特性是它会记住它停止执行的字符的索引,所以基本上,你可以一次又一次地调用这个方法,直到你得到一个 null
我们传递一个包含三个字符串的数组;其中两个会匹配,一个不会。为了得到多个结果,我们可以遍历数组并调用,exec()
直到得到一个null
. 另外,让我们创建一个空数组 matchedStrings
并将匹配的字符串推送给它。
注意:您必须将 g
标志传递给RegExp()构造函数才能获得所有结果,而不仅仅是第一个。这样,您将避免进入无限循环。
1 | let regex = new RegExp(/\w+a{3}@gmail\.com/, "g"); |
test() 函数
test()
方法类似于 exec()
除了它不返回包含信息的数组,而是一个简单的 true
或 false
. 它执行相同的搜索 exec()
,如果模式与字符串匹配,则返回 true
。否则,返回 false
:
1 | let regex = new RegExp(/\w+a{3}@gmail\.com/, "i"); |
对同一个字符串进行两次测试,将得到不同的结果:
1 | let regex = new RegExp(/\w+a{3}@gmail\.com/, "g"); // Remember the 'g' flag when working with multiple results |
test()
字符串数组的用法与 相同 exec()
,不同之处在于您将打印出 true / false
。实际上,这并不常用,除非您要跟踪匹配字符串的数量。
match()方法
match()
方法是 String
我们将要研究的第一个方法 - 它适用于正则表达式。
它接受一个正则表达式作为参数并返回一个匹配数组,或者 null
,如果没有,那么本质上 - 与实例的exec()
方法大致相同的 API RegEx
:
1 | let regex = new RegExp(/\w+a{3}@gmail\.com/, "g"); // Note the 'g' flag |
注意:也可以在此处使用 RegEx
来缩短代码,因为 RegEx
无论如何都会编译为实例:
1 | let string = "someEmailaaa@gmail.com"; |
我们将 RegEx
更改为 /[a-z]/
- 以仅匹配小写字符:
1 | let regex = new RegExp(/[a-z]/, "g"); // Note the 'g' flag |
search() 方法
search()
方法搜索传递的模式和字符串之间的匹配项。如果找到匹配项,则返回其索引。否则,该方法返回-1:
1 | let regex = new RegExp(/\w+a{3}@gmail\.com/, "g"); // Note the 'g' flag |
replace() 方法
replace(to_replace, replace_with)
方法返回一个新字符串,其中模式匹配 to_replace
被替换为 replace_with
。
它不会更改原始字符串,因为字符串是不可变的。
to_replace
参数可以是一个字符串或一个RegExp
实例。如果是字符串,则只会替换第一个出现的位置,而如果是RegExp
,则将替换每个出现的位置。
替换gmail.com
为yahoo.com
1 | let regex = new RegExp(/gmail\.com/, "g"); // Note the 'g' flag |
总结
RegExp
类 - 一个类,其目的是用来表示一个正则表达式exec()
方法 - 其搜索字符串中的正则表达式,并返回匹配的阵列(具有附加信息)。test()
方法 - 这只是如果有一个字符串并返回匹配测试true/ false
。match()
方法 - 在所定义的String
,则返回匹配的阵列(没有附加信息)。search()
方法 - 在已定义String
,返回匹配的索引中找到。replace()
方法 - 在已定义String
,取代了RegExp()
用一个字符串。
参考
- https://stackabuse.com/guide-to-regular-expressions-and-matching-strings-in-javascript/
- https://regexr.com/
关注【公众号】,了解更多。
赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!