一.es5正则表达式学习
1.初始化
直接量语法
/pattern/attributes
创建 RegExp 对象的语法
new RegExp(pattern, attributes);
修饰符(attributes) 描述
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。
2.RegExp对象拥有的属性
属性 描述 FF IE
global RegExp 对象是否具有标志 g。 1 4
ignoreCase RegExp 对象是否具有标志 i。 1 4
lastIndex 一个整数,标示开始下一次匹配的字符位置。 1 4
multiline RegExp 对象是否具有标志 m。 1 4
source 正则表达式的源文本。
3.RegExp对象的方法及作用
var patt1=new RegExp("e");
(1)patt1.test(str)
作用:查找str中有没有符合patt1的内容
返回值:boolean
(2)patt1.exec(str)
作用:查找str中存在的结果
返回:查找的结果,否则为null
(3)patt1.compile(patt)
作用:改变正则表达式
返回:无
4.方括号(用于查找范围)
表达式 描述
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
[adgk] 查找给定集合内的任何字符。
[^adgk] 查找给定集合外的任何字符。
(red|blue|green) 查找任何指定的选项。
5.元字符(是拥有特殊含义的字符,可以筛选某些范围的字符)
元字符 描述
. 查找单个字符,除了换行和行结束符。
\w 查找单词字符。
\W 查找非单词字符。
\d 查找数字。
\D 查找非数字字符。
\s 查找空白字符。
\S 查找非空白字符。
\b 匹配单词边界。
\B 匹配非单词边界。
\0 查找 NUL 字符。
\n 查找换行符。
\f 查找换页符。
\r 查找回车符。
\t 查找制表符。
\v 查找垂直制表符。
\xxx 查找以八进制数 xxx 规定的字符。
\xdd 查找以十六进制数 dd 规定的字符。
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。
6.量词(匹配数量)
量词 描述
n+ 匹配任何包含至少一个 n 的字符串。
n* 匹配任何包含零个或多个 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 的字符串。
7.String对象上的正则方法
(1)stringObj.search(regexp)
作用:匹配stringObj中第一个符合regexp的起始位置
返回值:返回stringObj中第一个符合regexp的起始位置,否则返回-1
(2)stringObj.match(searchvalue) 或者 stringObj.match(regexp)
作用:匹配字符串中符合条件的值
返回值:返回结果数组,否则返回null
(3)stringObj.replace(regexp/substr,replacement)
作用:用replacement替换stringObj中符合条件中的子川
返回值:一个新的字符串
(4)stringObject.split(separator,howmany)
作用:将stringObject以separator分割,howmany设置返回的数组的长度
返回值:分割后的数组
二.es6正则表达式的扩展
1.StringObj上的4个方法全部转移到RegExp上,目前对于怎么调用还是不知道,留待以后查询
2.let regexp = new RegExp(/abc/ig,”g”);es6中可以这么用,即new RegExp(/abc/ig,”g”)前面是正则表达式,后面再次指定修饰符,最后采用指定的修饰符
3.u修饰符
含义:”Unicode”模式,能够正确处理大于\uFFFF的Unicode字符,会正确处理四个字节的UTF-16字符
/^\uD83D/u.test('\uD83D\uDC2A') // false
/^\uD83D/.test('\uD83D\uDC2A') // true
(1)点字符能识别大于\uFFFF的字符
var s = '?'; // 2个字节存储的字符
/^.$/.test(s) // false
/^.$/u.test(s) // true
(2)Unicode字符表示法
// 识别\u61字符而不是两次61个u
/\u{61}/.test('a') // false
/\u{61}/u.test('a') // true
(3)识别量词
/?{2}/.test('??') // false
/?{2}/u.test('??') // true
(4)元字符匹配
// \S匹配所有非空格字符,加上u后呢能够正确识别2个字节存储的字符
/^\S$/.test('?') // false
/^\S$/u.test('?') // true
(5)i修饰符
4.y修饰符
粘连修饰符,含义是:和g修饰符一样都是全局匹配,都从上一次匹配的下一个字符开始进行下一次匹配.但是,y修饰符是只从下一个字符开始,如不匹配就结束,而g修饰符是从下一个字符开始剩下的字符中有匹配的就可以
var s = 'aaa_aa_a';
var r1 = /a+/g;
var r2 = /a+/y;
r1.exec(s) // ["aaa"]
r2.exec(s) // ["aaa"]
// 这次从位置3开始匹配,剩下的字符是"_aa_a"
r1.exec(s) // ["aa"],"_aa_a"中存在符合条件的
r2.exec(s) // null,"_aa_a"第一个没有匹配,所以匹配结束,返回null
5.sticky是RegExp是否有y修饰符
6.flags属性,显示RegExp的修饰符
7.s修饰符
使得RegExp中点能够识别
U+000A 换行符(\n)
U+000D 回车符(\r)
U+2028 行分隔符(line separator)
/foo.bar/s.test('foo\nbar') // true
8.后行断言
先行断言
/x(?=y)/ 即x在y前才能匹配
/x(?!y)/ 即x不在y前才能匹配
后行断言
/(?<=y)x/ 即x在y后面才能匹配
/(?<!y)x/ 即x不在y后面才能匹配
由于后行断言的一些差异行为,还不是很理解,以后在研究
9.Unicode属性类
// 匹配希腊字符
const regexGreekSymbol = /\p{Script=Greek}/u;
regexGreekSymbol.test('π') // true
10.具名组匹配
const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj.groups.year; // 1999
const month = matchObj.groups.month; // 12
const day = matchObj.groups.day; // 31
上面代码中,“具名组匹配”在圆括号内部,模式的头部添加“问号 + 尖括号 + 组名”(?),然后就可以在exec方法返回结果的groups属性上引用该组名(匹配不上即为undefined)。同时,数字序号(matchObj[1])依然有效。
利用解构赋值
let {groups: {one, two}} = /^(?<one>.*):(?<two>.*)$/u.exec('foo:bar');
one // foo
two // bar
如果要在正则表达式内部引用某个“具名组匹配”,可以使用\k<组名>的写法
const RE_TWICE = /^(?<word>[a-z]+)!\k<word>!\1$/;
RE_TWICE.test('abc!abc!abc') // true
RE_TWICE.test('abc!abc!ab') // false