初学js正则
以下内容仅作为个人总结,如果有误,还请指出,谢谢
正则表达式的用途大致分为三种:
- 判断字符串是否匹配某种模式
- 将字符串中符合某种模式的内容替换掉
- 将字符串中符合某种模式的内容提取出来
js创建正则表达式:
- 通过实例化类的方
-
new RegExp(pattern, attributes);
参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式
参数 attributes 是一个可选的字符串,被称为修饰符,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。
注意 :
如果 pattern 不是合法的正则表达式,或 attributes 含有 "g"、"i" 和 "m" 之外的字符,抛出该异常提示SyntaxError
如果 pattern 是 RegExp 对象,但没有省略 attributes 参数,抛出该异常提示TypeError
-
字面量的方式
-
/pattern/attributes
js正则表达式相关属性:
- global 标识该正则是否具有修饰符 g
- ignoreCase 标识该正则是否具有修饰符 i
- multiline 标识该正则是否具有修饰符 m
- source 正则表达式中的字符串文本
- lastIndex 一个整数,标示开始下一次匹配的字符位置 ( test和exec方法执行后会修改该值,以备下一次匹配 )
js正则表达式相关方法:
- compile 方法将
pattern
转换为内部的格式,从而执行得更快。例如,这允许在循环中更有效地使用正则表达式。当重复使用相同的表达式时,编译过的正则表达式使执行速度更快。然而,如果正则表达式发生更改,则这种编译毫无益处。 - test 检索字符串是否匹配该正则模式。匹配则返回 true 否则返回 false。
- exec 检索字符串中指定的值。返回找到的值,并确定其位置。如果正则表达式中包含捕获性分组,则返回值中也包含捕获到的结果
支持正则表达式的 String 对象的方法:
- search 方法用于检索一个字符串中是否含有该子字符串或者是否含有符合该正则模式的内容,如果有则返回该内容在字符串中的起始位置,否则返回 -1
- match 方法可在字符串内检索指定的值,或找到一个或多个符合该正则模式的结果, 如果检索到相关信息则返回一个包含检索结果的数组, 否则返回 null
- replace 方法可将一个字符串中符合子字符串或符合该正则模式的内容替换为指定内容,
- split 方法可以将一个字符串中以符合子字符串或符合该正则模式的内容为分割符,将该字符串拆分为数组,并返回这个数组,如果未匹配到分隔符,则数组以原字符串为第一项
正则表达式基本语法:
方括号:
用于查找某个范围内的字符,但只匹配其中一个,比如 /[abc]/ 则表示匹配 abc中的任意一个字符; 方括号中 - 符号表示范围匹配, 比如 /[1-3]/ 则表示 匹配 1 到 3 之间的任意一个数字, [a-z]同理, 注意 - 字符在方括号中属于特殊字符, 如果需要匹配它, 需要转义; ^符号在方括号中的表现特殊,表示按非取值,比如 /[^abc]/ 表示匹配除 abc 三个字符之外的任意字符
元字符: 拥有特殊含义的字符
- . 除换行符(\n)和行结束符(\r)以外的任意字符
- \w 所有英文字母和下划线
- \W 除所有英文字母和下划线以外的任意字符
- \d 所有数字
- \D 所有非数字
- \s 所有空白字符
- \S 所有非空白字符
- \b 匹配单词边界
- \B 匹配非单词边界
- \n 换行符
- \f 翻页符
- \t 制表符
- \v 垂直制表符
- \r 回车符
- \xxx 查找以八进制数 xxx 规定的字符
- \xdd 查找以十六进制数 dd 规定的字符
- \uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符
量词
- ? 匹配 0 个或 1 个
- * 匹配 0 个或多个
- + 匹配 1 个或多个
- {n} 匹配 n 个
- {n,} 匹配 >= n 个
- {n,m} 匹配 >= n && <= m 个 ( m 必须大于 n )
开始符
^n 匹配任何开头为 n 的字符串
结束符
n$ 匹配任何结尾为 n 的字符串
正向前瞻
?=n 匹配任何其后紧接指定字符串 n 的字符串。
负向前瞻
?!n 匹配任何其后没有紧接指定字符串 n 的字符串
分组
() 代表捕获性分组, 使用时regexp对象会将分组内匹配到的内容记录下来
(?:) 代表非捕获性分组, 使用时regexp对象不会将分组内匹配到的内容记录下来
特别是在使用 match 和 exec 时, 如果匹配到捕获性分组中的内容时, 返回的数组中将包含该内容
反向引用
前面捕获性分组中记录下来的值就称为反向引用 ,反向引用可以通过 $符号加上序号1-9获取; 反向引用也可以在正则表达式中通过 \1 ,\2, \3... 这类的形式使用, 比如 /\d+(\D)\d+\1\d/ 其中的 \1 就是前面 (\D) 匹配到的结果
贪婪匹配和惰性匹配
贪婪匹配会去尽可能多的匹配结果, 而惰性匹配则是尽可能少的匹配结果
比如 /(a+)/.exec('aaaad') 则返回 [ 'aaaa', 'aaaa', index: 0, input: 'aaaad' ] 此为贪婪匹配
而 /(a+?)/.exec('aaaad') 则返回 [ 'a', 'a', index: 0, input: 'aaaad' ] 此为惰性匹配
所有量词在匹配的时候均为贪婪匹配,在其后加上 ? 字符后则变为惰性匹配