正则方法
search() 方法 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。
replace() 方法 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
exec() 方法用于检索字符串中的正则表达式的匹配。该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
split() 用来把一个字符串拆分为多个子串的String方法。
match() 用来匹配一个字符串的String方法。
正则规则
- 通常情况下正则会返回第一个匹配结果
g (意思是'global',全局), 返回一个包含所有匹配结果的数组
- 通常情况下正则匹配区分大小写
i 强制执行一次不区分大小写搜索
- 英文.
. (英文句号),可以匹配任何一个单个字符、字母、数字、或者.本身。除了\符。 可以连续出现,也可以以间隔形式出现。
- 元字符
\ (转移符号) 这个符号有特殊含义,并不是字符本身的含义。 [和] (匹配的字符集合) 只负责定义字符集合,字符集合的匹配结果是能够与该集合里的任意一个成员相匹配的文本。
- -(连字符)
- [0-9] [a-z] [A-Z] 不能[3-1]这样写 只有写在[和]里表示连接符,写下其他地方只表示普通字符,所以不用转义。
- 取非匹配[^]
[^] 除去[]里匹配的字符 [^0-9] 匹配任何不是数字的字符
- 空白字符串
[\b] 回退(并删除)一个字符 \f 换页符 \n 换行符 \r 回车符 \t 制表符(Tab键) \v 垂直制表符
- 字符类
\d 任何一个数字字符 \D 任何一个非数字字符 \w 任何一个字母数字字符或下划线字符 \W 任何一个非字母数字字符或下划线字符 \s 任何一个空白字符 \S 任何一个非空白字符
- 匹配进制
\x 十六进制前缀,\x0A对应ASCII字符10(换行符),与\n一样 \0 八进制前缀,\011对应于ASCII字符9(制表符),与\t一样
重复匹配
- [+ ,* ,? ,]
+ 匹配一个或多个字符。 [0-9+] 表示匹配0-9之间的数组和+号字符。 * 匹配零个或多个字符。 ? 只能匹配一个字符(或字符处理)的零次或一次出现,只匹配前面的字符。 {和} 可以设定重复次数。可以是重复的值,也可以是一个区间。 {3} 刚好重复三次。 {2,4} 重复2-4次。 {2,} 至少重复两次。
贪婪型元字符和对应的懒惰型
贪婪型元字符 匹配的越多越好
-
对应的懒惰型 只匹配一个,适可而止
贪婪型元字符 懒惰型元字符 * *? + +? {n,} {n,}?
位置匹配
- 单词边界
\b 用来匹配一个单词的开始或结尾,它匹配的位置是\w和\W之间的位置。 \B 不匹配一个单词边界。
- 字符串边界
^ 字符串开头 $ 字符串结尾
子表达式
- (和)
(和) 会被视为独立的元素 (19|20) 19或20,|会把前后的看做一个整体
回溯引用
-
JS里使用\来标识回溯引用(\与$配合进行替换操作时例外)
回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式 [ ]+(\w+)[ ]+\1 \1的内容与(\w+)的一样 - 回溯引用只能用来引用模式里的子表达式(用(和)阔起来的正则表达式) - 回溯引用匹配通常从1开始计数(如\1、\2,等等)。\0可以用来代表整个正则表达式。 - 回溯引用也有不足之处,添加或删除子表达式,会使子表达式的相对位置改变。
-
回溯中的替换操作
$ $0代表整个正则匹配的
-
大小写转换的元字符
js好像没用
元字符 说明 \E 结束\L或\U转换 \l 把下一个字符转换成小写 \L 把\L到\E之间的字符全部转换为小写 \u 把下一个字符转换为大写 \U 把\U到\E之间的字符全部转换为大写 var str = "<h1>abc</h1>" str1 = str.replace(/\<h1\>(.*?)\<\/h1\>/g,function(){ let arr = [...arguments] console.log(arr); return arr[1].toUpperCase() }); console.log(str1);
前后查找
- 向前查找(向左查找)
?= 以?=开头的子表达式,需要匹配的文本跟在=的后面。 会返回结果,只是这个结果的字节长度永远是0。 长度是可变的。
- 向后查找
?<= 可以把<=看做箭头,他指向文本阅读方向的后方。 只是固定长度。
-
查找操作符
操作符符 说 明 (?=) 正向前查找 (?!) 负向前查找 (?<=) 正向后查找 (?<!) 负向后查找 支持向前查找的,一般都支持正向前查找和负向前查找。向后查找也是如此。 负向查找实际上是取非的作用。 (?=\$)\d 以$开头的数字 (?!\$)\d 不以$开头的数字
-
非捕获性分组匹配
?: 非捕获性分组工作模式下分组(?:)会作为匹配校验,并出现在匹配结果字符里面,但不作为子匹配返回。 捕获性分组:会返回结果以及其他子表达式所匹配的结果集合 非捕获性分组:返回结果以及子表达式里没有?:的结果集合
例:
var str1 = '000aaa111'; var pattern = /([a-z]+)(\d+)/; // 捕获性分组匹配 var pattern2 = /(?:[a-z]+)(?:\d+)/; // 非捕获性分组匹配 console.log(pattern.exec(str1)) // 捕获性分组匹配结果 ['aaa111','aaa','111'] console.log(pattern2.exec(str1)) // 非捕获性分组匹配结果 ['aaa111']
插入条件
-
回溯引用条件
回溯引用条件只在一个前面的子表达式搜索成功的情况下才允许使用一个表达式。
?(1) 1代表第几个子表达式(第几个括号),0代表整个正则表达式 var reg = /(<[Aa]\s*[^>]*>)(?(1)\s*<\/[Aa]>)/; 只有第一个括号里有匹配结果,即?(1)有值,才会继续它后面的匹配
-
前后查找条件
前后查找条件只有一个向前查找或向后查找取得成功的情况下才允许一个表达式被使用。
?(?=) ()里放入前后查找表达式,当前后查找表达式匹配到才继续匹配。