什么是正则
在常见的字符串检索或替换中,我们需要提供一种模式表示检索或替换的规则。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
这里只讲解简单的内容。
简单的正则
/abc/
- 匹配包含 “abc” 的字符串,如 “abcd”
/[a-z]{4}/
- 匹配包含 4 个小写英文字母的字符串,如 “1abcd2”
/\d\d\d/
- 匹配包含三个数字的字符串,如 “a123”
正则规则
字符 | 描述 | 栗子 |
---|---|---|
. | 任意字符(除换行符以外:\n,\r,\u2028,\u2029) | /.../.test('1a@'); |
\d | 数字 0-9 | /\d\d\d/.test('123'); |
\D | 非\d,即不是数字 0-9 的字符 | /\D\D\D/.test('ab!'); |
\w | 数字 0-9,或字母 a-z 及 A-Z(大小写),或下划线 | /\w\w\w\w/.test(aB9_); |
\W | 非\w,同理 | /\W\W\W/.test('@#$'); |
\s | 空格符、TAB、换页符、换行符 | /\sabc/.test(' abc'); |
\S | 非\s,同理 | |
\t \r \n \v \f | TAB、回车、换行、垂直制表符、换页符 |
范围符号
字符 | 描述 | 栗子 |
---|---|---|
[...] | 字符范围 [a-z] [0-9] [A-Z0-9a-z_]【这个跟上面\w是一个意思】 | 寄几动手试试 |
[^...] | 字符范围以外 [^a-z] [^abc] | |
^ | 行首 | /^Hi/.test('Hi, dalao') |
$ | 行尾 | /test$/.test('do a test') |
\b | 零宽单词边界 什么是零宽单词边界? 单词:指的就是上面的 \w 边界:就是单词的两侧,不是说每一个单词的两侧,注意了 | /\bno/.test('a no') 测试零宽单词边界是什么: 'a no ! 啊 - . , . / _'.replace(/\b/g, '①') 输出:”①a① ①no① ! 啊 - . , . / ①_①” |
\B | 非\b,同理 |
分组
字符 | 描述 | 栗子 |
---|---|---|
(x) | 分组,并记录匹配到字符串。单独写的话没啥意义,一般配合\n (n是数字) | |
\n (n是数字) | 表示使用分组符(x)匹配到的字符串 | /(abc)\1/.test('abcabcccc'); |
(?:x) | 仅分组 | /(?:abc)(def)\1/.test('abcdefdeffff'); |
重复
字符 | 描述 | 栗子 |
---|---|---|
x* x+ | 重复次数>=0,就是说可以是只出现0次 重复次数>0,就是说最少要出现一次 贪婪算法,多多少都可以 | /abc*/ 将匹配ab、abc、abcccc/abc+/ 将匹配abc、abcccc |
x*? x+? | 重复次数=0,即匹配0个 重复次数=1,即匹配一个,多了不匹配 非贪婪算法,多了就不要了 | /abc*?/ 将只匹配ab/abc+?/ 将只匹配abc |
x? | 出现0或1次 | |
x|y | x或者y | /x|y/ 匹配x,也匹配y/ab|cd|ef/ 匹配ab或cd或ef |
x{n} x{n,} x{n,m} | 重复n次 重复>=n次 重复>=n,<=m次 | /x{5}/ 匹配xxxxxoo,不匹配xxo/x{1,3}/ 匹配x,xx,xxx |
三个FLAG
FLAG | 描述 | 栗子 |
---|---|---|
global | 匹配整个字符串,有些查询可能匹配到第一个就结束了。 | /a/g 或者RegExp('a', 'g') |
ignoreCase | 不区分大小写,字面意思。 | /aaa/i 或者RegExp('aaa', 'i') |
mutiline | 是否需要在分行、跨行时依然执行检索。 注意 1、目标字符串只有一行的时候 “abcabc” mutiline没有意义。 2、正则表达式不含 ^ 或 $ 时,mutiline没有意义 | /^abc/m.test('aa\nabc') 或者RegExp('^abc', 'm') |
提示:三个FLAG都是可以随意混搭的
栗子:/a/gmi
或/a/igm
都是一个意思,同理RegExp('a', 'mig')
或RegExp('a', 'mgi')
RegExp对象属性
属性:global
、ignoreCase
、mutiline
、source
/abc/g.global; // true
/abc/i.ignoreCase; // true
/abc/m.mutiline; // true
/abc/gmi.source; // "abc"
RegExp对象方法
方法 | 描述 | 栗子 |
---|---|---|
exec | 和match 有点像,不过是反过来。match 是字符串match正则,exec 是正则exec字符串 | /abc/.exec('abcdef') 返回 “abc” |
test | 即是否匹配 | /abc/.test('abcdef') 返回 true |
toString | 即整个正则的内容 | /abc/.toString() 返回 “/abc/” |
compile | 可以改变正则的一些属性 | var reg = /abc/; reg.compile('def'); 这时打印reg会看到是/def/reg.test('def'); |
string类型与正则相关的方法
字符 | 描述 | 栗子 |
---|---|---|
String.prototype.search | 返回匹配的index | 'ddddabcabcdefg'.match(/(abc)\1/); |
String.prototype.replace | 替换,返回结果字符串(变量本身不会改变) | 'aabbbbcc'.replace(/b+?/, '1'); 替换第一个'aabbbbcc'.replace(/b+?/g, '1'); 替换全部 |
String.prototype.match | 匹配,返回匹配数组或者null | 'aabbbbcc'.match(/b+/); 'aabbdbbcc'.match(/b+/g); |
String.prototype.split | 分割字符串 | 'aabbbbcc'. split(/b+/); // ["aa", "cc"] |