# 概念
var regexp = new RegExp(pattern, modifiers);
TIP
pattern: 描述表达式模式
modifiers: 修饰符--用于指定全局,区分大小写和多行匹配
# 修饰符
- i 执行大小写不敏感的匹配
- g 执行全局匹配
- m 执行多行匹配
# 方括号
用于查找某个范围内的字符
[abc] -- 查找方括号内的任意字符
[^abc]-- 查找任何不再放阔内的字符
[0-9]---查找任何从0-9的数字
...
# 元字符
拥有特殊含义的字符
- . 查找单个字符,除换行和行结束符
- \d 数字
- \D 非数字
- \s 空白符
- \S 非空白符
- \w 查找单词字符
- \W查找非单词字符
- \b 代表着单词的开头或结尾,也就是单词的分界处
- \B 匹配不是单词开头或结束的位置
- [^x] 匹配除了x意外的任意字符
- [^aeiou] 匹配除了aeiou这几个字母以外的任意字符
# 量词
- n+ 包含至少一个n个字符
- n* 零个或多个
- n? 零个或者1个
- n{x} 包含x个n的序列字符串
- n{x,y}
- ?=n 匹配任何其后紧接指定字符串n的字
- ?!n 匹配任何其后没有紧接着指定n的字符串
# 用法
# test() 是否含有相同的字符串,返回true、false
var aes = 'abc'
/abc/.test(aes);
# match() 字符串方法是否有符合匹配字符串,返回一个数组
var reg = /abc/gi;
var abc = 'abcedabcsdfABC';
console.log(abc.match(reg)) // ['abc', 'abc', 'ABC']
console.log(abc.match(/abc/)) // ['abc', 'ab', 'c', index: 0, input: 'abcedabcsdfABC', groups: undefined]
# search()方法 第一个匹配字符串的下标
# split()
'0.1'.split(/?=\./)
# replace()
# exec() 方法,将匹配成功的内容放到数组
$1, $2, $3
var reg = /(.*)\s(.*)/gi;
var str = 'baidu taobao';
console.log(str.replace(reg, '$2,$1')); // $1 代表baidu $2代表taobao
# 问题
- 创建含变量的正则表达式
判断字符串含不含关键字,但是这个关键字是个变量
var a = '二叉树'
var reg = /a+/; // 用字面量创建对象,无论怎么写都会把a当成正则一部分对待
解决办法是用构造函数创建正则表达式对象
var reg = new RegExp(a + '+', 'gim')
还有一种办法是用eval()函数
var reg = eval('/'+ a + '+' + /gim)
但是eval()这个函数能不用就不用
- test结果不一致问题
原因是设置了全局匹配,该正则表达式的lastIndex属性会在:
- 匹配成功,设置为为匹配成功的子字符串的最后一个字符索引在加一,如果还用这个正则表达式对字符串进行匹配,它会以lastIndex作为匹配的起点
- 匹配失败时,lastIndex设置为0
解决办法
要么不设置全局匹配,要么就每次在正则匹配完成后,手动把lastIndex设置为0
// 测试
var a = '123234'
var reg = /1/g;
reg.test(a)
console.log(reg.lastIndex)
reg.lastIndex = 0