正则表达式详解( 二 )


A:因为字符类除了能表示选择,还包括另外两种字符,脱字符和连字符,这两种字符又有新的功,可以将字符类理解成选择符的一种超集 。

  • 脱字符(^)
表示可以匹配除字符类中字符以外的所有字符,因为这个符号和位置字符中的"^"开始位置字符是相同的,所以在使用时要注意区别,直接"^"放在正则表达式开头的是位置字符,放在"[]"中开头的"^"表示的是脱字符 。
var reg=/^123/; //位置字符reg.test("1234"); //truevar reg=/[^123]/; //脱字符reg.test("123"); //falsereg.test("4") //true
  • 连字符(-)
表示匹配连续字符序列中的任意一个字符,如:[abcdef]可以写成[a-f],[012345678]可以写成[0-9]等,这大大提升了字符类书写的简便性 。
var reg=/0-9/; //表示匹配字符串"0-9"reg.test("0") //falsereg.test("0-9")//truevar reg=/[0-9]/;reg.test("0") //false==注意:虽然连字符用起来十分简便,但是一定要避免过度使用连字符,因为连字符往往设定的是一个比较大的范围,如果不注意可能会匹配到意料之外的一些字符 。比如:[A-z],表面上它是要匹配到A-Z和a-z这52个字符,但是实际上在ASCII编码中,在Z和a之间还有很多其他字符,所以可能机会出现意料之外的匹配效果 。
var reg=/[A-z]/;reg.test('['); //true分析:因为"["字符在Z和a之间,所以也能被匹配到 。
预定义模式
预定义模式是指某些常见模式的简写方式,可以理解成是内置的正则表达 。
  • d 匹配0-9之间的任一数字,相当于[0-9] 。
  • D 匹配所有0-9以外的字符,相当于[^0-9] 。
  • w 匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_] 。
  • W 除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_] 。
  • s 匹配空格(包括换行符、制表符、空格符等),相等于[ trnvf] 。
  • S 匹配非空格的字符,相当于[^ trnvf] 。
  • b 匹配词的边界 。
  • B 匹配非词边界,即在词的内部 。
重复类
模式的精确匹配次数,使用大括号({})表示 。{n}表示恰好重复n次,{n,}表示至少重复n次,{n,m}表示重复不少于n次,不多于m次,默认匹配的是单个字符,若想要重复字符串,可以使用括号 。
var reg=/12{2,5}3/; //默认表示匹配单个字符"2"的次数为2-5次reg.test("1223") //true reg.test("12123") //falsevar reg=/(12){2,5}3/; //表示匹配字符串"12"的次数为2-5次reg.test("1223") //false reg.test("12123") //true量词符
量词符是内置用来设定某个模式出现的次数的,默认也是匹配单个字符的次数 。
  • ? 问号表示某个模式出现0次或1次,等同于{0, 1} 。
  • * 星号表示某个模式出现0次或多次,等同于{0,} 。
  • + 加号表示某个模式出现1次或多次,等同于{1,} 。
贪婪和非贪婪模式
  • 贪婪模式(默认):即最大可能匹配,匹配直到下一个字符不满足匹配规则为止,上面说的三个量词符,默认模式都为贪婪模式 。
var s = 'aaa';var reg=/a+/;s.match(reg); //["aaa"]
  • 非贪婪模式:即最小可能匹配,匹配到一个满足匹配规则的字符就停止,将贪婪模式改为非贪婪模式只需要在量词符后面加一个问号 。
var s = 'aaa';var reg=/a+?/;s.match(reg); //["a"]总结:
  • *?:表示某个模式出现0次或多次,匹配时采用非贪婪模式 。
  • +?:表示某个模式出现1次或多次,匹配时采用非贪婪模式 。
修饰符
修饰符(modifier)表示模式的附加规则,放在正则模式的最尾部,有g,i,m三种修饰符 。
修饰符可以单个使用,也可以多个一起使用 。
// 单个修饰符var reg = /test/i;// 多个修饰符var reg = /test/ig;
  • g修饰符
默认情况下,第一次匹配成功后,正则对象就停止向下匹配了 。g修饰符表示全局匹配(global),加上它以后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换 。
var s = 'aaa';var reg=/a+?/;s.match(reg); //["a"]var s = 'aaa';var reg=/a+?/g;s.match(reg); //["a","a","a"]
  • i修饰符
默认情况下,正则对象区分字母的大小写,加上i修饰符以后表示忽略大小写(ignorecase)
var s = 'Aaa';var reg=/a/;s.match(reg); //["a"]var s = 'Aaa';var reg=/a/i;s.match(reg); //["A"]
  • m修饰符
m修饰符表示多行模式(multiline),会修改^和$的行为 。默认情况下(即不加m修饰符时),^和$匹配字符串的开始处和结尾处,加上m修饰符以后,^和$还会匹配行首和行尾,即^和$会识别换行符(n) 。


推荐阅读