创建正则表达式的方法
var reg1 = /abc/g
var reg2 = new RegExp('abc','g')
上面两种创建正则表达式表达的意思一样,另外,在用第二种方法创建正则表达式的时候里面的参数也可以使用正则表达式,例如:
var reg3 = new RegExp(reg1)
此时,reg3所表达的意思也和前面的一样,但是reg3与reg1指向不同的地址空间但是需要注意,如果写成
var reg3 = RegExp(reg1)
此时的reg3和reg1指向的是同一块地址空间
支持正则表达式的String对象的方法
match | 找到一个或多个正则表达式的匹配。 |
---|---|
replace | 替换与正则表达式匹配的子串。 |
这两个方法下面的例子会用到
修饰符
i 表示匹配正则表达式的时候忽略大小写
g 代表全局匹配
m 多行匹配
这里对m做一下解释,如果待匹配的字符串是多行字符串,例如字符串中加入了\n,此时
var str = 'ab\nab\nab'
var reg = /^ab/gm
此时匹配的结果就为[“ab”, “ab”, “ab”],而如果不加m修饰符,则匹配的结果为[“ab”],此时就只匹配到了一个
方括号
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
[adgk] 查找给定集合内的任何字符。
[^adgk] 查找给定集合外的任何字符。
(red|blue|green) 查找任何指定的选项。
这里举例加以说明
var reg = /[abc]/
var str = "abcdefg"
console.log(str.match(reg))
此时打印的结果就是 [“a”, “b”, “c”],注意,这里面方括号里面的内容相当于表示的是一个字符的取值范围
. | 查找单个字符,除了换行和行结束符===/[^\r\n]/ |
---|---|
\w | 查找单词字符===/[0-9A-z_]/ |
\W | 查找非单词字符,相当于\w的补集 |
\d | 查找数字,等价于/[0-9]/ |
\D | 查找非数字字符\d的补集 |
\s | 查找空白字符,等价于/[\t\n\r\v\f+空格]/ |
\S | 查找非空白字符,\s的补集 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
\0 | 查找 NULL字符 |
\n | 查找换行符 |
\f | 查找换页符 |
\r | 查找回车符 |
\t | 查找制表符 |
\v | 查找垂直制表符 |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符,这个方法可以用来匹配中文文字 |
对于上的\b,匹配单词边界,个人理解的是表示一行的开头,例如
var reg = /\bab/g
var str = "abab\nabefgab"
console.log(str.match(reg))
此时打印的结果就是[“ab”, “ab”],因为\n表示将字符串换行了,而换行后后面的那个ab就表示成单词边界了,如果写成下面的形式
var reg = /\bab/g
var str = `ab
ab
abefgab`
console.log(str.match(reg))
匹配的结果就是 [“ab”, “ab”, “ab”],上面``是ES6新增的语法
量词
n+ | 匹配任何包含至少一个 n 的字符串 |
---|---|
n* | 匹配任何包含0个或多个 n 的字符串 |
n? | 匹配任何包含零个或一个 n 的字符串 |
n{X} | 匹配包含 X 个 n 的序列的字符串 |
n{X,Y} | 匹配包含 X 至 Y 个 n 的序列的字符串 |
n{X,} | 匹配包含至少 X 个 n 的序列的字符串 |
n$ | 匹配任何结尾为 n 的字符串 |
^n | 匹配任何开头为 n 的字符串 |
?=n | 匹配任何其后紧接指定字符串 n 的字符串 |
?!n | 匹配任何其后没有紧接指定字符串 n 的字符串 |
对于量词的最后两个方法,可能没有那么容易理解,下面给出例子
//匹配a,但是这个a后面不能紧跟着b,则
var reg = /a(?!b)/g
var str = "abcdaab"
console.log(str.match(reg))
上面代码的打印 结果为[“a”],只有一个a,而其他的两个 a不能被匹配到,因为其后面紧跟着的是字符b,不能满足匹配规则
反向引用
如果要匹配多个相同的字符,就可以使用反向引用。对于/(a)\1/,后面的那个\1就表示反向引用第一个子表达式的值,而这里的第一个子表达式就是(a),表示匹配字母a,这个正则表达式的意思表示匹配aa,例如下面匹配的结果是[“aa”, “aa”, “aa”]
var reg = /(a)\1/g
var str = 'aaaabaaa'
console.log(str.match(reg))
而如果写成var reg = /(a)\1\1/g,表示反向引用两次,则打印的结果是[“aaa”, “aaa”]
下面再举一个例子,如果想要将aabb转换为bbaa,则可以用下面的写法
var str = "aabb"
var reg = /(\w)\1(\w)\2/g
console.log(str.replace(reg,"$2$2$1$1"))
上面的例子中,\1表示反向引用第一个子表达式的值,\2表示反向引用第二个子表达式的值,则正则表达式匹配的结果是aabb,在在字符串的replace里面,也可以使用字符串的反向引用,只是这里的引用形式变成了$,$2就表示b,$1表示的是a
试题
1、将形如100000000变成100.000.000
var str = "100000000"
var reg = /(?=(\B)(\d{3})+$)/g
console.log(str.replace(reg,'.'))
解题思路为从后面往前面找,找一个后面是三个数字的空白位置,将其替换为 . 。在正则表达式里面,最外层大括号前面没有写任何东西,就表示空白,?=表示紧接着空白的后面的字符,在前面的量词里面已经介绍过。\d{3}表示匹配三个数字,+代表进行多次匹配,$表示从结尾开始匹配,而最前面的\B,表示找到的 这个匹配形式不能是字符边界,是为了防止出现 .100.000 的情况发生
2 将the-first-name 变成小驼峰式命名,及变成theFirstName
解题思路,先找到-f,-n,再将其替换成F,N
var reg = /-(\w)/g
var str = "the-first-name"
console.log(str.replace(reg, function($, $1) {
return $1.toUpperCase()
}))
}
)
这里面的$1分别匹配为f 和 n,function里面的第一个参数表示匹配的所有结果,而$1表示反向引用第一个子表达式的结果。应当注意,这里的replace会执行两次。
RegExp的exec方法
exec方法也是用来匹配字符串的,他和字符串里面d的match方法有些类似,都是返回匹配到的字串,但是他们确有很大的不一样,这个方法会配合一个类似于游标的东西来使用,也就是他每次只会返回匹配到的第一个字串,然后游标向后移动,继续来检索将要匹配的字符串,而lastIndex就是这个游标,例如下面一段代码
var reg = /ab/g
var str = "ababab"
console.log(reg.lastIndex)
console.log(reg.exec(str))
console.log(reg.lastIndex)
console.log(reg.exec(str))
console.log(reg.lastIndex)
console.log(reg.exec(str))
console.log(reg.lastIndex)
console.log(reg.exec(str))
console.log(reg.lastIndex)
console.log(reg.exec(str))
上面代码在控制台的输出为
由以上的结果可以可看出,这个游标会循环的移动,一次匹配完成后,游标的位置又会变成0
RegExp的test方法
这个方法用来检索字符串里面指定的值,返回true或false,例如,下面的打印输出 为true
var str = abc
var reg = /a/g
console.log(reg.test(str))