什么是正则表达式
- 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
- 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
正则表达式的声明方式
-
通过new 关键字声明
// 参数是字符串类型 第一个是正则规则pattern 第二个是修饰符modifiers var patt = new RegExp(pattern,modifiers)
-
字面量形式声明
var patt = /pattern/modifiers;
正则的修饰符 modifiers
- g : 全局匹配(查找所有匹配而非在找到第一个匹配后停止)
- i : 不区分大小写
- m : 多行匹配
正则表达式的规则 pattern
正则的组成: 元字符 字符类 量词组成
元字符
- $: 以什么作为结束 (限定正则表达式的结束)
- ^: 以什么作为开始 (限定正则表达式的开始)
字符类
- […] : 匹配[]中的任意一个字符
- [^…] : 除了[]中的任意一个字符
- [0-9] : 匹配数字0-9
- [a-z] : 匹配小写字母
- [A-Z] : 匹配大写字母
针对常用的字符类 进行等价的简写形式
- \s : 查找空白字符。 匹配任意的空白符
- \w : 查找数字、字母及下划线。 等价于 [a-zA-Z0-9_]
- \d : 查找数字 等价于 [0-9]
- \S : 查找非空白字符。 除了空白符以外的
- \W : 等价于 [^a-zA-Z0-9_]
- \D : 等价于 [^0-9]
量词 量词都是对前边字符类进行限定
- {n,m} : 匹配最少n次,最多m次
- {n,} : 最少匹配n次,最多不限
- {n} : 匹配n次
- * : 匹配0次或者多次 等价形式 {0,}
- + : 匹配1次或者多次 等价形式 {1,}
- ? : 匹配0次或者1次 等价形式 {0,1}
贪婪模式和惰性模式 量词相关的匹配模式
- 贪婪模式: 尽可能多的去匹配 {n,m} {n,} * +
- 惰性模式: 尽可能少的去匹配 ?
// 贪婪模式 var str = '1232454567679632' var res = str.match(/\d{3,6}/g); console.log(res) // 惰性模式 贪婪模式转换为惰性模式 通过 ?? {}? *? +? var str = '1232454567679632' var res = str.match(/\d{3,6}?/g); console.log(res)
正则的候选 分组 反向引用
- 通过元字符 | 实现候选项
- 通过 () 实现分组功能 以及 反向引用
反向引用: 反向引用是引用匹配的结果,而不是匹配的规则
反向引用的形式: $n 和 \n ;其中n是整数 n代表的是左括号的顺序; \1 第一个(); \3 第三个()
var str = 'a hello a';
var res = str.replace(/(a)/g, '$1 world')
var patt = /<(h1)>hello<\/\1>/
查看反向引用
var patt = /(hello(java(script)))/g
var str = 'hellojavascript'
var res = patt.test(str);
console.log(RegExp.$1) // hellojavascript
console.log(RegExp.$2) // javascript
console.log(RegExp.$3) // script
console.log(RegExp.$4) // 空
- 只分组 不引用 ?:
var patt = /(hello(?:java(script)){2})/g
var str = 'hellojavascriptjavascript'
var res = patt.test(str);
console.log(RegExp.$1) // hellojavascript
console.log(RegExp.$2) // script
console.log(RegExp.$3) // 空
console.log(RegExp.$4) // 空
正向前瞻和负向前瞻
- ?=n : 正向前瞻; 匹配任何其后紧接指定字符串 n 的字符串。 exp1(?=exp2) : exp1后边的必须是exp2才匹配成功
- ?!n : 负向前瞻; 匹配任何其后没有紧接指定字符串 n 的字符串。 exp1(?!exp2) : exp1后边的必须不是exp2 才匹配成功
字符串中和正则相关的方法
- replace(patt, string) : 替换正则表达式匹配的字符串
- match() : 返回的结果是一个数组 ; 找到一个或者多个与正则表达式匹配的项
// 没有使用全局修饰符 g; 默认找到第一个匹配项之后停止查找 var res1 = '123245456'.match(/\d{3,6}/); // 匹配的结果是一个 /** 0: "123245" // 匹配的项 groups: undefined 分组 index: 0 // 匹配的索引值位置 input: "123245456" // 要匹配的字符串本身 */ // 使用全局修饰g : 查找所有的匹配项 var res2 = '123245456'.match(/\d{3,6}/g); // 匹配结果是多个
- search() : 检索是否存在与正则表达式匹配的项 存在则返回对应(匹配项在字符串中的)的索引值 ; 不存在则返回 -1, 自动忽略全局修饰g
var res = 'hello'.search(/a/);
- split() : 将字符串分割为字符串数组 参数是正则表达式功能变成的更加强大
var res = 'hello a world'.split(''); var res = 'hello a world'.split('a'); var res = 'hello 123 world 456 javascript'.split(/\d{3}/);
正则对象的属性和方法
- test() : 检索字符串中指定的值(检测字符是否符合正则规则)。符合返回 true , 不符合 返回false。
- exec() : 检索字符串中指定的值。返回找到的值,并确定其位置。如果找不到匹配的项,则返回 null; 每次执行相同的操作, 都是从上次匹配结束的位置开始进行下次匹配,原因就是因为 lastIndex属性
- 属性 lastIndex : 用于规定下次匹配的起始位置; 该属性只有设置标志 g 才能使用。
***上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。
只有设置标志 g 才能使用。
上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。
注意:该属性是可读可写的。只要目标字符串的下一次搜索开始,就可以对它进行设置。当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0