正则表达式(Regular Expression)

正则表达式工具: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))

原文地址:https://www.cnblogs.com/vikeykuo/p/r_express.html