正则表达式
反斜杠\
- 将具有语法意义的符号转化成为普通字符
- 转移字符
- 多行字符
RegExp(正则表达式)
创建正则表达式
var = /aabb/; // 字面量的创建方式
var = new RegExp(); // 构造函数的创建方式
正则表达式是一个对象
正则表达式修饰符
i
忽略大小写g
全局匹配m
多行匹配,能够识别多行
两个方法
-
reg.test(str)
对一个字符串对象进行判断,如果符合reg
的规则就返回true
,否则返回flase
-
str.match(reg)
文本对象上的方法,参数为RegExp
,返回一个数组,该数组中的值为满足reg
的字符串
表达式
[]
一个方括号代表一位,里面的值代表范围-
代表范围,如0-9^
放在表达式里面代表非(!
)
()
子表达式|
或子表达式
元字符
\w
单词字符,区间等于[0-9A-z_]\W
非单词字符,区间等于[^\w]\d
数字字符\D
等于[^\d]
\s
空白字符[\t\n\r\v\f]
\S
[^\s]
\b
单词边界,(原来我以为单单指的是空格,但是看起来某些情况下值的不是空格)\B
非单词边界\uXXXX
unicode
编码,一共16层\010000
-\100000
- . 是这个吗?
[^\r^\n]
,匹配除换行符之外的任何单个字符
量词
贪婪匹配原则,能多就不少
n+
n
这个变量可以出现1
-infinite
次n*
n这个变量可以出现0
-infinite
次n?
n
这个变量可以出现0
-1
个n{X}
n
这个变量可以出现X
个n{x, y}
n
这个变量可以出现x
-y
个,当y
不写的时候,也就是x
-infinite
个n$
以n
结尾的^n
以n
开头的
n
可以是单个的字符,也可以是一串字符,他可以是一个字符变量
RegExp方法
reg.lastIndex
记录游标的位置,为reg.exec(str)
方法而存在- reg.exec(str)
每次调用该方法都只会返回一个值(不论你是否加上了修饰符g
),并且每次调用都会依据reg.lastIndex
这个值,来返回匹配的字符串
反向引用
var reg = /(\w)\1/g
反向引用第一个子表达式的内容,这个反向引用只能是对于子表达式
来说的,至于\
后面的数字表示的意思是第几个子表达式,而不是重复几个子表达式。。。
var str = "aabb";
var reg = /(\w)\1(\w)\2/g
exec方法会记录每个子表达式的匹配的内容,以及每次匹配开始的起点
string方法
str.search(reg)
方法返回匹配字符串的位置,加g
或者不加g
都是一样的,都是只会返回第一次匹配字符串的起始位置
str.split(str)
里面可以传正则表达式str.replace(a, b)
如果参数b
不是正则表达式的话,那么只能替换匹配的第一个字符串
参数b
的数据格式只能为字符串,其中通过$
符号可以选择子表达式
str.replace(reg, function($, $1, $2) {
return $2+$2+$1+$1;
})
参数`b`作为一个函数的话,可以接受参数,其中`$`值为匹配正则表达式的字符,`$1` `$2`则分别是第一个子表达式和第二个子表达式
正向预查
var reg = /a(?=b)/g // 选择后面接字符b的a
b
只参与选择的修饰而不参与选择
?=b
值为a
?!b
值非a
打破贪婪匹配
量词的后面加一个问号,可以打破贪婪匹配的原则,能少就不会多
var reg = /a*?/
匹配0个a
,也就是空的字符串
var reg = /a+?/
能匹配到多个a
的u也只匹配1个a