es6学习之正则表达式

一.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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值