var reCat = new RegExp("cat", "gi"); //RegExp构造函数可以带一个或两个参数,第一个参数描述需要进行匹配的模式字符串,第二个参数指定了额外的处理命令 var reCat = /cat/gi; //使用Perl风格的语法 i:执行对大小写不敏感的匹配 g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) m:执行多行匹配
元字符
元字符是表达式语法的一部分,在正则表达式中用到的所有元字符有:{ [ ( \ ^ $ | ) ] } ? * + -
如匹配一个问号:var reQMark = /\?/; 或 var reQMark = new RegExp("\\?"); //注意这里是两个反斜杠,双重转义
\xxx 查找以八进制数 xxx 规定的字符,如:/\142/为字符b \xdd 查找以十六进制数 dd 规定的字符,如:/\x62/为字符b \uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符,如:/\u0062/为字符b \r 查找回车符 \n 查找换行符 \f 查找换页符 \t 查找制表符 \v 查找垂直制表符 \a 查找alert字符 \e 查找escape字符 \cX 查找与X相对应的控制字符 \0 查找 NULL 字符 . 查找单个字符,除了换行和行结束符,等同于[^\n\r] \w 查找单词字符,等同于[a-zA-Z_0-9] \W 查找非单词字符,等同于[^a-zA-Z_0-9] \d 查找数字,等同于[0-9] \D 查找非数字字符,等同于[^0-9] \s 查找空白字符,等同于[ \t\n\x0B\f\r],\x0B为垂直tab和\t一样 \S 查找非空白字符,等同于[^ \t\n\x0B\f\r]
方括号
[abc] 查找方括号之间的任何字符 [^abc] 查找任何不在方括号之间的字符 [0-9] 查找任何从 0 至 9 的数字 [a-z] 查找任何从小写 a 到小写 z 的字符 [A-Z] 查找任何从大写 A 到大写 Z 的字符 [A-z] 查找任何从大写 A 到小写 z 的字符 [adgk] 查找给定集合内的任何字符 [^adgk] 查找给定集合外的任何字符
量词
? 匹配任何包含零个或一个的字符串,如:ba?d匹配bd、bad
+ 匹配任何包含至少一个的字符串,如:ba+d匹配bad、baad
* 匹配任何包含零个或多个的字符串,如:ba*d匹配bd、bad、baad
{n} 匹配包含恰好出现n次的序列的字符串,如:ba{1}d匹配bad
{n,m} 匹配包含至少n次但不超过m次 的序列的字符串,如:ba{0,1}d匹配bd、bad
{n,} 匹配包含至少出现n次的序列的字符串,如:ba{0,}匹配bd、bad、baad、baaad
贪婪量词:先看整个的字符串是否匹配,如果发现没有匹配,去年该字符串中的最后一个字符并再次尝试,如:?、+、*、{n}、{n, m}、{n, },默认就为贪婪量词
惰性量词:先看字符串中的第一个字母是否匹配,如果单独这一个字符还不够,就读入下一个字符,组成两个字符的字符串,与贪婪量词的工作方式恰好相反,如:??、+?、*?、{n}?、{n, m}?、{n, }?
支配量词:只尝试匹配整个字符串,如果整个字符串不能产生匹配,不做进一步尝试,如:?+、++、*+、{n}+、{n, m}+、{n, }+
var sToMatch = "abbbaabbbaaabbb1234"; var re1 = /.*bbb/g; //匹配结果为"abbbaabbbaaabbb" var re2 = /.*?bbb/g; //只有惰性量词才能匹配成功,匹配结果为"abbb","aabbb","aaabbb" var re3 = /.*+bbb/g; //匹配不了,直接报错
复杂模式之分组:通过一系列括号包围一系列字符、字符类以及量词来使用的
/(dog){2}/ 匹配"dogdog"
/([bd]ad?)*/ 匹配空, "ba", "da", "bad", "dad"
/(mom( and dad)?)/ 匹配"mom", "mom and dad"
/^\s*(.*?)\s+$/ 匹配首尾的空白字符,也可以用/^\s+|\s+$/g
复杂模式之反向引用:也叫捕获性分组,按照从左到右遇到的左括号字符的顺序进行创建和编号的,例如表达式(A?(B?(C?)))将产生编号从1-3的三个反向引用:(A?(B?(C?)))、(B?(C?))、(C?)
反向引用有几种不同的使用方法:
首先,使用正则表达式对象的test()、match()或search()方法后,反向引用的值可以从RegExp构造函数中获得,如:
var sToMatch = "#123456789"; var reNumbers = /#(\d+)/; reNumbers.test(sToMatch); alert(RegExp.$1); //"123456789",$1保存了第一个反向引用,依次可以用$2,$3...
然后,可以直接在定义分组的表达式中包含反向引用,通过使用特殊转义序列如\1、\2等实现
var sToMatch = "dogdog"; var reDogdog = /(dog)\1/; //等同于/dogdog/ alert(reDogdog.test(sToMatch)); //true
第三,反向引用可以用在String对象的replace()方法中,通过使用特殊字符序列如$1、$2等实现
var sToChange = "1234 5678"; var reMatch = /(\d{4}) (\d{4})/; alert(sToChange.replace(reMatch, "$2 $1")); //"5678 1234"
复杂模式之候选:使用管道符(|)放在两个单独的模式之间