正则表达式工具:http://regexper.com
RegExp对象: 两种方法实例化RegExp对象
.字面量(定义变量,var reg = /正则表达式文本/g 添加g表示匹配所有符合表达式的字符串,否则只匹配第一个符合表达式的字符串)
.构造函数( var reg = new RegExp(‘正则表达式文本’,’修饰符’)第二个参数可有可无,据需求而定)
修饰符(对象属性) :
.g: global全文搜索,不添加,搜索到第一个匹配停止.
.i: ignore case 忽略大小写,默认大小写敏感.
.m:multiple lines 多行搜索,将换行符后的字符串当作新的字符串.
.lastIndex:是当前表达式匹配内容的最后一个字符的下一个位置(即下一个开始搜索的位置)
.source:正则表达式的文本字符串
元字符:查看元字符表
字符类:
.使用元字符[ ]来构建一个简单的类
.表达式[abc]把字符a或b或c归为一类,表达式可以匹配这类的字符
字符类取反:
.使用元字符^创建 反向类/负向类
.表达式[^abc]表示 不是字符a或b或c的内容
范围类:
.使用[a-z]来连接两个字符表示从a到z的任意字符
.这个是闭区间,包含了a和z本身
.在[ ]组成的类内部是可以连写的 [a-zA-Z]
.若是在范围内里相匹配 -符号,直接在范围后加上该符号即可ep: [a-z-]
预定义类:
匹配一个 ab+数字+任意字符 的字符串 ab/d.
边界符:
^: 以xxx开始
$: 以xxx结束
\b: 单词边界
\B: 非单词边界
量词:
?:出现零次或一次(最多出现一次)
+ :出现一次或多次(至少出现一次)
*: 出现零次或多次(任意次)
{n}: 出现n次
{n,m}: 出现n到m次
{n,}: 至少出现n次
贪婪模式(默认):
给一个范围,会尽可能多的去匹配一个字符串,ep:’12345678’.replace(/\d{3,6}/g,’p’), 会匹配到1-6,而不是1-3
非贪婪模式:
. 让正则表达式尽可能少的去匹配,即一旦成功匹配就不再继续尝试
. 该模式标识,需在量词后加上?
分组:
使用()可以达到分组的功能,使量词作用于分组
或:使用 | 可以达到或的效果
反向引用:$(1-n) 分别引用的是正则表达式中的(1-n)个分组
忽略分组:不希望捕获某些分组,只需要在分组内加上?:就可以
(注意:以上各符号需在英文输入法中输入才会起作用)
. 正则表达式从文本头部向尾部开始解析,文本尾部方向,称为“前”
前瞻:就是在正则表达式匹配到规则的时候,向前检查是否符合断言
. 符合和不符合特定断言称为 肯定/正向 匹配和 否定/负向 匹配
正向前瞻:exp(?=assert) (断言部分不参与匹配,只表示一个必须符合的匹配条件)
负向前瞻:exp(?!assert)
后顾/后瞻:与前瞻方向相反(JavaScript 不支持后顾)
正向后顾:exp(?<=assert) 负向后顾:exp(?<!assert)
正则表达式对象本身提供的两个方法:
. RegExp.prototype.test(str):用于测试字符串参数中是否存在匹配正则表达式模式的字符串,如果存在则返回true,否则返回false(受lastIndex影响,有个循环过程,字符串中有多少个符合匹配的就返回多少次true,之后就返回false)
. RegEx.prototype.exec(str):使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果,如果没有匹配的文本则返回null,否则返回一个结果数组
-index 声明匹配文本的第一个字符的位置
-input 存放被检索的字符串 string
. 调用非全局的RegExp对象的exec()时,返回数组,其lastIndex不起作用
第一个元素是与正则表达式相匹配的文本
第二个元素是与RegExpObject的第一个子表达式(即第一个分组)相匹配的文本(如果有的话)
第三个元素是与RegExpObject的第二个子表达式(即第二个分组)相匹配的文本(如果有的话)以此类推……
. 调用全局RegExp对象(即加了g修饰符的)的exec()时,返回多个数组
字符串对象方法:
. String.prototype.search(reg): 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,方法返回第一个匹配结果index,查找不到返回-1
该方法不执行全局匹配,它将忽略标识g,并且总是从字符串的开始进行检索
. String.prototype.match(reg):将检索字符串,以找到一个或多个与RegExp相匹配的文本,如果没有找到任何匹配的文本,将返回null,否则它将返回一个数组,其中存放了与它找到的匹配文本有关的信息,返回数组的内容与exec()方法返回的数组内容相同
返回的数组还含有两个对象属性:
. index 声明匹配文本的起始字符在字符串的位置
. input 声明对stringObject的引用
如果regexp没有标志g,那么match方法只能在字符串中执行一次匹配
如果有标志g,全局调用,找到字符串中的所有匹配子字符串,若没找到返回null,若找到了一个或多个匹配子串,则返回一个数组,数组元素中存放的是字符串中所有的匹配子串,而且也没有index属性或input属性
. String.prototype.split(reg): 常用这个方法把字符串分割为字符数组
ep: ‘a,b,c,d’.split(‘,’); — [“a”,”b”,”c”,”d”]
在一些复杂的分割情况下可以使用正则表达式解决
ep: ‘a1b2c3d’.split(/\d/);— [“a”,”b”,”c”,”d”]
. String.prototype.replace( str/reg, replaceStr/function(1.匹配字符串match,2.正则表达式的分组内容group…,没有则就没有该参数,3.匹配项在字符串中的index,4.原字符串origin))