正则表达式的声明
直接写在/与/之间
var reg = /...../;
使用RegExp()构造函数
var reg = new RegExp(......);
在ECMAscript 3中RegExp对象类似于引用对象,在ECMAscript 5中RegExp对象类似于值对象。
var reg= /a/; var reg2 =/a/; console.log(reg === reg2);//ES3标准返回true,ES5返回false //此时在ES3中reg与reg2指向同一个对象 //在ES5中reg与reg2为两个不同的对象
转义字符
正则表达式所有字符都按直面量进行匹配。加入反斜杠()可进行转义。
预定义类
. [^ ] 除了换行和回车之外的任意字符
d [0-9] 数字字符digit
D [^0-9] 非数字字符
w [a-zA-Z0-9_] 单词字符(所有的字母数字和_ ) word
W [^a-zA-Z0-9_] 非单词字符
s [f v] 不可见字符 space
S [^f v] 可见字符
量词
"*" 重复零次或更多 x>=0
"+" 重复一次或更多次 x>=1
"?" 重复零次或一次 x=(0||1)
{n} n次 x=n
{n,} 重复n次或更多 x>=n
{n,m} 重复出现的次数比n多但比m少 n<=x<=m
非贪婪匹配
当以上字符后再加入一个?时将进行非贪婪匹配如*?,??,+?.{n,m}?。
进行贪婪匹配时将尽可能少的匹配内容
如/a+/匹配aaa时将回匹配全部a即匹配“aaa”,而/a+?/匹配aaa时将匹配一个“a”。
需要注意的是非贪婪匹配从第一个匹配到的值开始。
例如使用/a+?b/匹配aaab时并不会按最少的匹配ab。而是匹配aaab。这是因为匹配是从第一个a开始匹配所以也会把之前的a都匹配到。
选择
“|”分割用于选择的字符
a|b|c可匹配a或者b或者c
分组
“( )”可用于分组调用exec方法返回Array对象,0位置为匹配到的完整内容,之后位置为”( )”所分组的数据。
var str = "abcdefg"; var r = /c(d(e))/; console.log(r.exec(str)); //["cde", "de", "e", index: 2, input: "abcdefg"]
在“(”后跟“?:”表示不获取
var str = "abcdefg"; var r = /c(?:d(e))/; console.log(r.exec(str)); // ["cde", "e", index: 2, input: "abcdefg"] 不获取de
元字符[ ]
匹配一个出现在 [] 中的字符。
var str1 = "abcde"; var str2 = "fghig"; var r = /[bg]/; console.log(r.exec(str1)[0]); //b console.log(r.exec(str2)[0]); //g
使用 [] 匹配多个字符:[a-z] [A-Z]
表示否定意思:[^abc] 不匹配^之后的字符
元字符^和$
^ 表示必须以某某开头
$ 表示必须以某某结尾
var r1 = /^a/; var r2 = /a$/; str1 = "ab"; str2 = "ba"; console.log(r1.test(str1)); //true console.log(r1.test(str2)); //false console.log(r2.test(str1)); //false console.log(r2.test(str2)); //true
当同时出现^和$时表示精确匹配
var r1 = /^asd$/; str1 = "asd"; str2 = "a-s-d"; console.log(r1.test(str1)); //true console.log(r1.test(str2)); //false
正则替换与组引用
replace方法第一个参数可以用正则表达式来表示需要被替换的内容。
var r1 = /^asd$/; str1 = "LandMine LLLLLL"; str1 = str1.replace(/L/g,"l"); //g表示全局匹配 console.log(str1); //landMine llllll
第二个参数出现$后跟数字表示正则组引用
var s = '1991-1-2'; s = s.replace( /(d+)-(d+)-(d+)/g, "$1年$2月$3日" ); console.log(s); //1991年1月2日