Javascript正则表达式

Web开发中,常常会遇到各种参数检验的问题,使用正则表达式能够达到让校验代码精简、清晰等效果。本文整理了正则表达式使用中最基础和常用的知识,以供参考。

创建正则表达式对象

var pattern =/ s$///直接量语法创建RegExp对象。

var pattern = new RegExp(s$)//构造函数方法

直接量字符

正则表达式中所有的字母字符和数字都是按照直接量与自身相匹配的。但是一些非字母字符则要借助于反斜杆(\)转意字符。二者统称为正则表达式的直接量字符。见表:

 

将单独的直接量字符放进方括号内就可以组成字符类。

字符类

 

重复

贪婪重复模式:

贪婪重复模式总是尽可能多的匹配符合它规则的字符。

 

非贪婪模式:

在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。

重复模式举例:

<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”因为匹配的条件是javascriptjava 随后要跟一个冒号。

标志

标志在表达式模式串的“/”之外。

 

使用正则表达式

String

 

RegExp

 

String进一步

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];

除此之外,非全局的正则表达式返回的数组还有两个属性——indexinput, 前者字符串中匹配开始处的字符的位置,例如这里是17,后者是目标字符串的一个副本,例如这里是“Visit my blog at http:// / www.example.com/~david"”。

RegExp进一步

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);

}