在Web开发中,经常会遇到各类参数检验的问题,使用正则表达式可以达到让校验代码精简、清晰等效果。本文整理了正则表达式使用中最基础和经常使用的知识,以供参考。javascript
var pattern =/ s$///直接量语法建立RegExp对象。java
var pattern = new RegExp(“s$”)//构造函数方法正则表达式
正则表达式中全部的字母字符和数字都是按照直接量与自身相匹配的。可是一些非字母字符则要借助于反斜杆(\)转意字符。两者统称为正则表达式的直接量字符。见表:数组
将单独的直接量字符放进方括号内就能够组成字符类。ide
贪婪重复模式:函数
贪婪重复模式老是尽量多的匹配符合它规则的字符。ui
非贪婪模式:url
在修饰匹配次数的特殊符号后再加上一个 "?" 号,则能够使匹配次数不定的表达式尽量少的匹配,使可匹配可不匹配的表达式,尽量的 "不匹配"。这种匹配原则叫做 "非贪婪" 模式,也叫做 "勉强" 模式。若是少匹配就会致使整个表达式匹配失败的时候,与贪婪模式相似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。spa
重复模式举例:对象
<script type="text/javascript" charset="UTF-8">
try{
str="<p>abcdefg</p><p>abcdefghijkl</p>";
re1=str.match(/<p>[\W\w]+?<\/p>/ig);
alert("非贪婪模式:\r\n\r\n1:"+re1[0]+"\r\n2:"+re1[1]);
// 输出结果:re1[0]——<p>abcdefg</p>,re1[1]——<p>abcdefghijkl</p>
re1=str.match(/<p>[\W\w]+<\/p>/ig);
alert("贪婪模式:\r\n\r\n"+re1);
// 输出结果:re1——<p>abcdefg</p><p>abcdefghijkl</p>
re1=str.match(/<p>(.+?)<\/p>/i);
alert("非贪婪模式,且不要标记:\r\n\r\n1:"+re1[1]);
// 输出结果:re1[1]——abcdefg
re1=str.match(/<p>(.+)<\/p>/i);
alert("贪婪模式,且不要标记:\r\n\r\n"+re1[1]);
// 输出结果:re1[1]——abcdefg</p><p>abcdefghijkl
}catch(e){
alert(e.description);
}
</script>
正则表达式的选择、分组和引用
举例:
选择:/ ab | cd | ef /匹配的是字符串“ab”、”cd”、“ef”中的任意一个字符串。
组合:
(1) /java(script)?/ script字符串被组合成一个单元,这个单元就像前面所看见的一个直接量字符,它和?一块儿用的时候表示,script可选,即匹配“java”或“javascript”。
(2) /[‘”][^’“]*[‘“]/ 和 / [‘”][^’“]*\1/ 有什么区别?区别就是前者能够匹配字符串“a”,也能够匹配字符串“a’;然后者只能匹配“a”,或‘a’。那么,“\1”的做用是什么?在同一个正则表达式中,用“\n”(在后部)来引用前面的子表达式。第一个正则表达式中第一个引号和第二个引号能够同样也能够不同,如第一个为单引号,而第二个为双引号;但第二个正则表达式的第一个引号和第二个引号必定是相同的。而第二个表达式的\1的意思是引用该正则表达式中的第一个子表达式,并且,引用的不是子表达式模式([‘”]),而是引用第一个子表达式的匹配的文本(意思是,若是第一个子表达式匹配的是单引号,那么引用的就是一个单引号)
(3) /([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*) / 和/ ( [Jj]ava([Ss]cript)? ) \sis\s(fun\w*) / 又有什么区别?即(?:…)和()一样用来把元素组合为一个单元,有什么区别?那就是前者不做为上一例子提到的\n引用,然后者能够,也就是说,若是在各自的正则表达式里增长\2,那么前者引用的是(fun\w*)匹配的结果,后者则引用([Ss]cript)? )匹配的结果。
正则表达式的锚字符,指定匹配的位置
举例:
/^javascript$/ 能够匹配字符串“javascirpt”;
/\bjava\b/匹配单个“java”,而不能匹配“javascirpt”;
/\B[Ss]cript/ 匹配“javascirpt”,或者“vbscript”,但不匹配“script”或者”scirpting”
/java(scirpt)?(?=\:)/ 匹配”javascript:The Definitive Guide”,但不能匹配“javascript in fun”由于匹配的条件是javascript或java 随后要跟一个冒号。
标志在表达式模式串的“/”以外。
replace的第二个参数能够利用正则表达式的“记忆功能”,用$n能够引用第一个参数(正则表达式)相应的与子表达式相匹配的结果。如:
var text = ' " 这里是第一个子表达式匹配的内容" ';
var quote= /" ( [^\"]*)" / g//正则表达式中只有一个括号,即只有一个子表达式
text.replace(quote, "“$1”"); //$1为第一个子表达式匹配的结果,即字符串" 这里是第一个子表达式匹配的内容" ,替换的结果是英文引号变为了中文格式的引号即“这里是第一个子表达式匹配的内容”
match注意正则表达式非全局搜索
若是是全局搜索返回数组是全部的匹配结果,这没什么复杂。若是不是全局搜索,那么数组的第一个元素是匹配的字符串,余下的元素是正则表达式中用括号括起来的子表达式。
举例:
var url = /(\w+):\ / \ //( [\w.]+)\ /(\S*) /;//非全局搜索
var text =" Visit my blog at http:// / www.example.com/~david"
var result = text.match(url);
if (result!=null) {
var fullurl = result[0]; //第一个元素是匹配结果
var protocol = result[1]; //下标为i 的元素是正则表达式中第i个子表达式的匹配结果
var host = result[2];
var path = result[3];
除此以外,非全局的正则表达式返回的数组还有两个属性——index和input, 前者字符串中匹配开始处的字符的位置,例如这里是17,后者是目标字符串的一个副本,例如这里是“Visit my blog at http:// / www.example.com/~david"”。
exec注意全局搜索
当有一个g标志的正则表达式调用exec()时,它将把该正则表达式对象的lastIndex属性设置为紧接着匹配子串的字符位置。当同一个正则表达式第二次调用exec()时,它将从lastIndex属性所指示的字符处开始检索。若是没有发现任何匹配,它会将lastIndex属性重置为0。
举例:
var pattern =/ java/g
var text = " javascript is more fun than java!";
var result ;
while((result = pattern.exec(text))! = null ){
alert("Matched ' " +result[0]+ " ' "+ " at position "+result.index + "; next search begins at " + pattern .lastIndex);
}