.(点好): 匹配除了换行符和其余Unicode行终止符(如回车符)以外的任意字符,等价于[^\n\r] \w: 匹配任何ASII单字字符,等价于[a-zA-Z0-9_] \W: 匹配任何非ASII单字字符,等价于[^a-zA-Z0-9_] \s: 匹配任何Unicode空白符,等价于[\t\n\x0B\f\r]
概念:如星号(*)元字符在执行匹配时,先看整个字符串是否匹配,若是不匹配则去掉该字符串中的最后一个字符,并再次尝试。html
1.?、{n}和{n,m}重复类正则表达式
这三个都具备弱贪婪性,主要表如今贪婪性具备有限性。对于?匹配,在选择匹配仍是不匹配时,若是条件容许,它老是会选择匹配而不是不匹配;{n,m}在条件容许的状况下,匹配m次,而不是n次。 正则式的贪婪性是在遵循匹配条件基础上尽量占有更多的字符,而不是随意占用。
2.*、+和{n,}重复类算法
这三个具备强贪婪性,这种贪婪表现为贪婪的无限性
星号(*)重复类的匹配底线是最宽容的,匹配欲望是最强烈的。不论是否存在指定字符或子表达式都会执行匹配操做数组
加号(+)重复类的匹配底线是最少存在一个符合指定条件的字符或子表达式,不然不予执行匹配操做浏览器
{n,}重复类的匹配底线是最灵活的,执行任意底线和条件的无限贪婪的匹配操做。spa
正则表达式是有贪婪性的,它老是与最长的长度匹配,并且越是排在左侧的重复类匹配符优先级就越高。code
var s = "<html><head><title></title></head><body></body></html>"; var r = /(<.*>)(<.*>)/ var a = s.match(r); alert(a[1])//<html><head><title></title></head><body></body> alert(a[2])//</html>
上面的演示说明,当多个重复类并列子在一块儿时,左侧重复类具备较大的优先权,并尽量的占有更多的符合条件的字符。htm
惰性匹配它将先查看字符串中的第一个字符是否匹配,若是匹配条件不够,就读入下一个字符。若是仍是匹配不足够,惰性匹配会继续从字符串中读取字符串直到发现匹配或者整个字符串都检查过也没有匹配为止。惰性匹配只须要在重复类后面添加问号(?)就能够了。问号必须放在重复字符串后面。
贪婪匹配体现了最大化匹配原则,那么惰性匹配体现了最小化匹配原则。但不论是那种匹配都必须保证匹配知足正则表达式基本条件。图片
{n,m}?: 正则表达式尽可能匹配n次,可是为了知足匹配条件也可能最多重复m次ip
{n}?: 正则表达式尽可能匹配n次;
{n,}?: 尽可能匹配n次,但为了知足匹配条件也可能匹配任意次
??: 正则表达式尽可能匹配,可是为了知足匹配条件也可能屡次匹配1次,至关于{0,1}?
+?: 尽可能匹配1次,可是为了知足匹配条件也可能匹配任意次数,至关于{1,}?
*?:至关于{0,}?
这个是另外一种类型的匹配模式,它的算法是:只匹配整个字符串。若是整个字符串不能匹配,则会自动放弃匹配,再也不执行迭代以求进一步尝试。支配匹配只须要在重复类后面添加加号(+)便可。
1.分组:就是经过用小括号来包含一系列字符、字符类,或者重复类量词,以实现处理各类特殊的字符序列
经过小括号逻辑分隔符,实现分别储存每一个被匹配的标签,最后经过这个数组类获取每一个标签的名称。小括号表示一个独立的逻辑域,其匹配的内容将被独立存储。
分组的应用价值
把单独的项目进行分组,以便合成子表达式,这样就能够像处理yi个独立的字符那样,使用|、+、*或?等字符来处理他们。
在正则表达式中,经过分组能够在一个完整的模式中定义子模式。当一个正在表达式成功地与目标字符串匹配时,也能够从目标字符串中抽出与小括号中的子模式相匹配的部分。
var s = "ab=21,bc=45,cd=43"; var r = /(\w+)=(\d+)/; var a = s.match(r); ["ab=21","ab","21"]
在同一个正则表达式的后部分能够引用前面的子表达式。这是经过在字符“”后加一位或多位数字实现的。数字指定了带括号的子表达式在正则表达式中的位置
var s = "<h1>title</h1><p>text</p>" var r = /(<\/?\w+>).*\1/g; var a = s.match(r);//["<h1>title</h1>","<p>text</p>"]
正则表达式分组会占用必定的系统资源,在较长的正则表达式中,存储反向引用会下降匹配速度。建立非引用型分组的方法是,在括号的后面分别加上一个问号和冒号。(?:w*?)
正则表达式用来声明正则表达式在什么条件下才能匹配,或者不在什么条件下才会匹配,这种声明包括正前向声明和反向前声明两种模式
正前向声明是指匹配模式后面的字符,声明表示条件的意思,也是指定在接下来的字符必须被匹配,但并不真正进行匹配。通俗的讲,就是指定可能执行匹配操做的条件,该条件做为正则表达式的匹配模式一部分而存在,可是不会真正使用该条件去执行匹配。
var s = "a:123 b=345"; var r = /\w*(?==)/; var a = s.match(r);//["b"]
反前向声明,就是指定接下来的字符都没必要匹配,反前向声明使用“(?!匹配条件)”来表示
var s = "a:123 b=345"; var r = /\w*(?!=)/; var a = s.match(r);//['a']
var s = "JavaScript, not Javascript"; var r = /(Java)Script/gi; var a = r.exec(s); RegExp.input//"JavaScript, not Javascript" RegExp.leftContext//空字符串 RegExp.rightContext//", not Javascript" RegExp.lastMatch//"JavaScript" RegExp.lastParen//"Java"