正则表达式是匹配模式,要么匹配字符,要么匹配位置。
本文是作者在阅读老姚的
正则表达式迷你小书基础部分后整理的一些笔记
强烈推荐阅读本文的小伙伴再去看看老姚的
正则表达式迷你小书
一、正则表达式的字符匹配
1、实现模糊匹配--正则强大的体现
-
1.横向模糊匹配:使用量词,指定
量词前面字符的出现次数- 量词(重复)及含义:
- (1)
{m}恰好出现m次 - (2)
{m,}出现至少m次 - (3)
{m,n}出现至少m次,至多n次 - (4)
+出现至少1次 等价于{1} - (5)
?出现0次或1次 等价于{0,1} - (6)
*出现至少0次 等价于{0,}
- (1)
- 量词(重复)及含义:
-
2.纵向模糊匹配:使用
[]来提供多种可能,内部元素存在或的关系/a[123]c/表示可以匹配a1c、a2c、a3c中的任何一个
2、字符组 使用[]表示很多字符的组合(内部元素存在或的关系,仅匹配内部元素中的一个)
-
1.
[]直接使用[abc] -
2.
[]与-连字符一起使用,表范围,- (1)
[a-z]任意小写字母 - (2)
[A-Z]任意大写字母 - (3)
[A-z]任意字母(大写A,小写z) - (4)
[0-9]任意数字 - !!!注意,当要匹配两个字符和
-中的一个,为了不让引擎误解,可以将-放到最前面[-ad]、最后面[ad-]或者使用\转义[a\-d]
- (1)
-
3.
[]与^一起使用,不会匹配仅是内部的单个元素- 例如:
/[^ab]/,不匹配"a"或"b" 字符串,其他的都可以
- 例如:
-
4.
[]与-和^一起使用,范围排除,例如:[^a-z] -
5.常见的简写(系统自带的)
- (1)
\w表示任意字母、数字、_ 等价于[A-z0-9_] - (2)
\W表示除了字母、数字、_ 等价于[^A-z0-9_] - (3)
\d表示任意数字 等价于[0-9] - (4)
\D表示除了数字 等价于[^0-9] - (5)
\s表示空格、制表符、换行符和换页符 - (6)
\S表示除了空格、制表符、换行符和换页符 - (7)
.表示除换行符和其他Unicode行终止符外的任意字符
- (1)
3、量词的贪婪和惰性匹配
- 贪婪匹配:就是会将量词中的
所有情况全部匹配一次- 例如
/2{2,5}/,会匹配22、222、2222和22222
- 例如
- 惰性匹配:就是
尽可能少的匹配,语法:在量词后面添加?- 例如
/2{2,5}?/,就只会匹配22
- 例如
4、多选分支 使用| 或 来提供多个模式选择
/匹配规则1 | 匹配规则2/二者选一个- !!!分支是惰性的,前面的能匹配上,就不往后匹配了(即使后面的匹配更精确)
- 用
/good|goodbye/,去匹配 "goodbye" 字符串时,结果是 "good"。
- 用
二、正则表达式的位置匹配
位置(锚)是相邻字符之间的位置。
1、^(脱字符)匹配开头,在多行匹配中匹配行开头。
- 直接使用:
^a,表示以a开始的字符串 - 注意区分
[^]
2、$(美元符号)匹配结尾,在多行匹配中匹配行结尾。
- 例如:
c$表示以c结束的字符串
3、\b 表示单词边界
-
\w与\W之间的位置 -
\w与^开始之间的位置 -
\w与$结束之间的位置 -
\w任意字母、数字、_ 等价于[A-z0-9_] -
\W除了字母、数字、_ 等价于[^A-z0-9_]
var result = "[JS] Lesson_01.mp4".replace(/\b/g, '#'); console.log(result); // => "[#JS#] #Lesson_01#.#mp4#"
4、\B 就是 \b 的反面的意思,非单词边界。除单词边界外的其他位置
5、() 括号中的元素会被当做一个整体,优先级高,再按相应规则去匹配
- 1.
(x)整体匹配并记住字符x,例如:/(foo)(bar)\1\2/在这个正则表达式中,第一个()中的foo将作为一个整体被匹配,且被记住,在被记住后可以使用\1来表示,同理第二个()中的bar也将作为一个整体被匹配,且被记住,在被记住后可以使用\2来表示,依此类推,如果存在,可以使用\3、\4或\5等- !!!是可以使用
\n来表示被记住的整体字符,而非必须要使用
- !!!是可以使用
- 2.
(?:x)整体匹配但不记住字符x,例如:/(?:foo){1,2}/,在这个正则中foo将会被当做一个整体被匹配1次或2次 - 3.
x(?=y),匹配那些后面有y的x,又被叫做先行断言- 例如:
/a(?=b)/,在字符串"abacada"中只会匹配第一个a,因为只有这个a后面有b,其他的a后面没有跟着b
- 例如:
- 4.
(?<=y)x,匹配那些前面有y的x,又被叫做后行断言- 例如:
/(?<=b)a/,在字符串"bacadaa"中只会匹配第一个a,因为只有这个a前面有b,其他的a前面都没有b
- 例如:
- 5.
x(?!y),匹配那些后面没有y的x,正向否定查找- 例如:
/a(?!b)/,在字符串"abacada"中不会匹配第一个a,因为这个a后面有b,其他的a都会被匹配,因为后面没有跟着b
- 例如:
- 6.
(?<!y)x,匹配那些前面没有y的x,又被叫做反向否定查找- 例如:
/(?<!b)a/,在字符串"bacadaa"中只不会匹配第一个a,因为这个a前面有b,其他的a都会被匹配,因为前面都没有b
- 例如:
6、位置的特性
- 可以将
位置看做空格,字符串中的每个字符的左右两边都有一个或多个假定的空格,也就是位置,位置的数量不影响规则判断的结果
/^hello$/和/^^hello$$$/甚至是/(?=he)^^he(?=\w)llo$\b\b$/的匹配结果是一样的