正文
一、创建一个正则表达式
- 字面量形式创建:
let re = /ab+c/
脚本加载后,正则表达式字面量就会被编译。当正则表达式保持不变时,使用此方法可以获得更好的性能。
- 调用 RegExp 对象的构造函数创建:
let re = new RegExp("ab+c")
在脚本运行过程总灰姑娘,用构造函数的正则表达式会被编译。如果正则表达式将会改变,或者它将会从用户输入等来源中动态地产生,就需要使用构造函数来创建正则表达式。
二、使用特殊字符
当需要匹配一个不确定的字符串时,比如寻找一个或多个 "b",或者寻找空格,可以在模式中使用特殊字符。特殊字符分为四类:
- 断言(Assertions)
表示一个匹配在某些条件下发生。断言包含先行断言、后行断言和条件表达式。 - 字符类(Charater Classes)
区分不同类型的字符串,例如区分字母和数字。 - 组合范围(Groups and Ranges)
表示表达式字符的分组和范围。 - 量词(Quantifiers)
表示匹配的字符或表达式的数量。 - Unicode 属性转义(Unicode Property Escapes)
基于 unicode 字符属性区分字符。例如大写和小写字母、数学符号和标点。
三、重点讲下量词(Quantifiers)
Characters | Meaning |
x* |
将前面的项“x”匹配0次或更多次。例如,/bo*/匹配“A ghost booooed”中的“boooo”和“A bird warbled”中的“b”,但在“A goat grunt”中没有匹配。 |
x+ |
将前一项“x”匹配1次或更多次。等价于{1,}。例如,/a+/匹配“candy”中的“a”和“caaaaaaandy”中的“a”。 |
x? |
将前面的项“x”匹配0或1次。例如,/e?le?/匹配angel中的el和angle中的le。如果立即在任何量词*、+、?或{}之后使用,则使量词是非贪婪的(匹配最小次数),而不是默认的贪婪的(匹配最大次数)。 |
x{n} |
其中“n”是一个正整数,与前一项“x”的n次匹配。例如,/a{2}/ 不匹配“candy”中的“a”,但它匹配“caandy”中的所有“a”,以及“caaandy”中的前两个“a”。 |
x{n,} |
其中,“n”是一个正整数,与前一项“x”至少匹配“n”次。例如,/a{2,}/不匹配“candy”中的“a”,但匹配“caandy”和“caaaaaaandy”中的所有a。 |
x{n,m} |
其中,“n”是0或一个正整数,“m”是一个正整数,而m > n至少与前一项“x”匹配,最多与“m”匹配。例如,/a{1,3}/不匹配“cndy”中的“a”,“candy”中的“a”,“caandy”中的两个“a”,以及“caaaaaaandy”中的前三个“a”。注意,当匹配“caaaaaaandy”时,匹配的是“aaa”,即使原始字符串中有更多的“a”。 |
x*? 、x+? 、x?? 、x{n}? 、x{n,}? 、x{n,m}? |
默认情况下,像 * 和 + 这样的量词是“贪婪的”,这意味着它们试图匹配尽可能多的字符串。?量词后面的字符使量词“非贪婪”:意思是它一旦找到匹配就会停止。 |
四、使用实际案例重点讲下量词里的“非贪婪模式”
今天在用 JavaScript 解析网站 cookie 时,想用正则表达式去分割字符串,原始 cookie 是这样的的:
_ga=GA1.2.1746497339.1619346346; _gid=GA1.2.1173823228.1646632358; lux_uid=164666330248053214
第一次是下面这样解析的:
;(async () => { let a = document.cookie a += "; " let cookieKeys = a.split(/=.*; /) // 这里是重点,split里是正则表达式 console.log(cookieKeys) })();
split 里的正则表达式默认是贪婪的,导致执行结果是下面这样的:
['_ga', '']
第二次找到原因了,于是像下面这样解析:
;(async () => { let a = document.cookie a += "; " let cookieKeys = a.split(/=.*?; /) // 这里是重点,split里是正则表达式 console.log(cookieKeys) })();
这次就对了,细心观察一下会发现 split 里的正则表达式多了一个 ?
,
默认情况下,像 * 和 + 这样的量词是“贪婪的”,这意味着它们试图匹配尽可能多的字符串。?量词后面的字符使量词“非贪婪”:意思是它一旦找到匹配就会停止。*
正确的结果如下(将 3 个 cookie 里的 key 的名字解析出来了):
['_ga', '_gid', 'lux_uid', '']
前端 考察 JavaScript 里正则表达式的使用还是蛮多的,需要认真掌握的。