定义
正则表达式就是使用表达式,来查找或比对复杂字符串,达到模糊搜索或过滤的作用。
构成
正则表达式的字符模式是,由一系列拥有特殊功能的元字符,和一系列修饰符组成的,特殊格式的字符串。
创建方式
字面量创建
使用 let 直接创建一个正则表达式,查找从 0 至 9 的数字,也就是查找所有数字。
let demo = /[0-9]/;
实例创建
查找空格或者空白。其中的 ‘ \ ’ 为转义字符。
let demo = new RegExp('\\s')
二者之间的区别
- 字面量创建方式不能进行字符串拼接,实例创建则可以。
-
let demo1 = 'wdn'; let demo101 = new RegExp(demo1+'md'); // => '/wdnmd/' let demo102 = /demo1/; // => '/demo1/'
-
- 字母量创建方式特殊含义的字符不需要转义,实例创建则需要
-
let demo1 = new ReqExp('\s') // => '/s/' let demo2 = new ReqExp('\\s') // => '/\s/' let demo3 = /\s/ // => '/\s/'
-
语法
元字符
- 拥有特殊含义的字符
- 普通元字符
元字符 | 描述 |
---|---|
/asd/ | 匹配 ‘ / ’ 之中的字符串 |
- 特殊元字符
元字符 | 描述 |
---|---|
\ | 转义字符,' n ' 匹配字符 ' n '。' \n ' 匹配一个换行符。序列 ' \\ ' 匹配 ' \ ' , 而 ' \( ' 则匹配 ' ( ' 。 |
. | 匹配除了换行符 ‘ \n ’ 所有的单个字符。要包括 ‘ \n ’ 则使用 ‘ (.|\n) ’ |
^ | 设置开始的元字符 |
$ | 设置结束的元字符 |
\n | 匹配一个换行符 |
\d | 数字字符,作用等同于 ‘ [0-9] ’。 |
\D | 非数字字符,作用等同于 ‘ [^0-9] ’。 |
\w | 字母、数字、下划线,作用等同于 ' [A-Za-z0-9_] '。 |
\W | 非字母、数字、下划线,作用等同于 ' [^A-Za-z0-9_] '。 |
\s | 任何空白字符,包括空格、制表符、换页符等等,作用等同于 ‘ [ \f\n\r\t\v] ’ 。 |
\S | 任何非空白字符,作用等同于 ‘ [ ^\f\n\r\t\v] ’ 。 |
\t | 匹配一个制表符,作用等同于 ' \x09 ' 和 ' \cI ' 。 |
\f | 匹配一个换页符 |
\r | 匹配一个回车符 |
\b | 单词边界,也就是指单词和空格间的位置。例如: ' er\b ' 可以匹配 " never " 中的 ' er ' ,但不能匹配 " verb " 中的 ' er ' 。 |
x|y | x 或 y,例如:' z|food ' 能匹配 " z " 或 " food "。' (z|f)ood ' 则匹配 " zood " 或 " food "。 |
修饰符
修饰符 | 描述 |
---|---|
i | 对大小写不敏感的匹配 |
g | 进行全局匹配并非在查找到第一个就停止匹配而是查找所有 |
m | 进行多行的匹配 |
数量修饰符
- 表示数量的修饰
数量修饰符 | 描述 |
n+ | 匹配至少包含一个 ‘ n ’ 的字符串,类似 {1,} 例如:‘ /a+/ ’ 匹配 ‘ are ’ 中所有的 ‘ a ’,' aaaa ' 中所有的 ’ a ‘ |
n* | 匹配任何包含零个或多个n的字符串,类似 {0,} 例如:' /ar*/ ' 匹配 ‘ are ’ 中的 ‘ ar ’, ' add ' 中的 ‘ a ’, ‘ aaaa ’ 中的 ‘ a ’, 但是不匹配 ' re ' |
n? | 匹配任何包含零个或一个n的字符串,类似 {0,1} 例如:‘ / de? / ’ 匹配 ‘ deff ’ 中的 ‘ de ’, 匹配 ‘ dede ’ 中的 ‘ de ’, 匹配 ‘ dfd ' 中的 ' d ', 不匹配 ’ eee ‘ |
n{x} | x是一个非负整数,匹配确定的 x 个 n 例如:' o{2} ' 不匹配 ‘ Bob ’ 中的 'o',但匹配 ’ food ‘ 中的两个 ’ o ‘ |
n{x,} | x是一个非负整数,至少匹配 x 个 n 例如,' o{2,} ' 不匹配 ’ Bob ‘ 中的 ' o ',但匹配 ’ foooood ‘ 中的所有 ’ o ‘ |
n{x, y} | x 和 y 均为非负整数且 x <= y,最少匹配 x 次,最多匹配 y 次 例如,‘ o{1,3} ’ 将匹配 ‘ fooooood ’ 中的前三个 ‘ o ’ |
n$ | 匹配所有结尾为 ‘ n ’ 的字符串 |
^n | 匹配所有开头为 ‘ n ’ 的字符串 |
n(?=m) | 匹配任何后面紧接着 ' m ' 的 ' n ' 在m前面加个空格就可以匹配和 ' m ' 之间有一个空格的 ' n ' |
n(?!m) | 匹配任何后面没有接着 ' m ' 的 ' n ' |
方括号
- 用于查找某个范围内的字符
方括号 | 描述 |
[^xy] | 未包含 ' x ' 、' y ' 的任意字符 |
[xyz] | 包含 ' x ' 、' y ' 、' z '的任意字符 |
[x-z] | ' x-z ' 这个范围中的任意字符 |
[^x-z] | 非 ' x-z ' 这个范围中的任意字符 |
·[A-z] | 查找从 ' A ' 到 ' Z ' 的所有大小写字符 |
正则表达式的方法
test()
- 检测字符串是否符合正则表达式的规则,返回布尔值,符合则返回ture。
-
let demo = /[0-9]/ demo.test('2') // => true demo.test('a') // => false
exec()
- 检测字符串是否有符合正则表达式的规则,如果有符合的部分则返回该匹配值,否则null。
-
let demo = /[0-9]/ demo.exec('aaa') // => null demo.exec('1') // => ["1", index: 0, input: "1", groups: undefined]
支持正则表达式的字符串方法
search()
- 用于匹配字符串中指定的子字符串,或匹配与正则表达式规则匹配的子字符串
- 返回匹配到的子字符串所在的位置,没有匹配到则返回 -1
-
'string'.search('valuestring') // => -1 'stringvalue'.search('string') // => 0 'valuestring'.search('string') // => 5
match()
- 可以在字符串内匹配指定的值,或匹配一个、多个符合正则表达式的匹配
- 使用时需要加上 g 如果没有 g 则该方法就只会执行一次,加上 i 可以大小写都匹配
- 返回关于所有匹配到的子字符串信息的数组,若没有则返回 null
-
'foot'.match(/a/g) // => null 'foot'.match(/o/g) // => (2) ["o", "o"] 'foOt'.match(/o/gi) // => (2) ["o", "O"]
replace()
- 用于在字符串中用一些字符串替换另一些字符串,或替换一个与正则表达式规则匹配的字符串
- 可以使用修饰符来限制匹配
-
'abcda'.replace(a, 'ooo') // => "ooobcda" 'abcda'.replace(/a/g, 'ooo') // => "ooobcdooo"
split()
- 可以把一个字符串分割成字符串数组
- 分割的位置可以是指定的参数,或是一个正则表达式,从正则表达式匹配到的参数处分割
-
'How are you doing today?'.split(' ') // => (5) ["How", "are", "you", "doing", "today?"] 'How are you doing today?'.split(/[a-c]/) // => (3) ["How ", "re you doing tod", "y?"] 'How are you doing today?'.split(/[a-c]/, 1) // => (1) ["How "] 'How are you doing today?'.split(' ', 3) // => (3) ["How", "are", "you"]