正则表达式在javascript中的应用

来源:互联网 发布:连锁药店数据分析 编辑:程序博客网 时间:2024/06/05 09:57

1.正则表达式简介

         正则表达式通常用于两种任务:1.验证,2.搜索/替换。用于验证时,通常需要在前后分别加上^和$,以匹配整个待验证字符串;搜索/替换时是否加上此限定则根据搜索的要求而定,此外,也有可能要在前后加上\b而不是^和$,如果是全文搜索还需要在后面加上g

如var reg=/\w*o(\w+)?/gi ,i表示不区分大小写。

尊重他人劳动成果转载请说明出处:http://blog.csdn.net/dxswzj/article/details/9111327

2.在javascript中使用正则表达式的函数介绍

        Javascript中有6个函数可以使用正则表达式:match、exec、test、search、replace、split。

        其中match,search,replace,split是String的方法,exec、test是RegExp类的方法

2.1 matcher

match是String的方法stringObj.match(rgExp),exec是RegExp类的方法

使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回

stringObj.match(rgExp)
参数
stringObj
必选项。对其进行查找的 String 对象或字符串文字。
rgExp
必选项。为包含正则表达式模式和可用标志的正则表达式对象。也可以是包含正则表达式模式和可用标志的变量名或字符串文字。
其余说明与exec一样,不同的是如果match的表达式匹配了全局标记g将出现所有匹配项,而不用循环,但所有匹配中不会包含子匹配项。

@例子:

<script language="javascript"type="text/javascript">var objStr= "Yue I lOve you till theend of my life!";var re=/\w*o(\w+)?/gi;//该表达式用来匹配一个以/w代表的字符,第二个字符是o,后面有一个字符或者多个字符+表示前面的字符匹配的次数,全局匹配 ,后面的g表示继续往下走即全局 i表示不区分大小写,相当于 var re = newRegExp("\\w*o(\\w+)?","gi");  双引号要加多一次转义的\\wvar arr=objStr.match(re);//调用match方法匹配字符串并且如果存在返回数组,如果没有结果返回为nulldocument.write("匹配前的字符串:"+objStr+"<br>");if(arr!=null){//如果能匹配成功即arr数组不为空,循环输出结果for(var i=0;i<arr.length;i++){      document.write("<li>"+arr[i]);}}</script>


输出结果:

如果表达式改为var re=/\w*o(\w+)?/g;则只输出:you of 因为对大小写敏感lOve不匹配

2.2 exec

用正则表达式模式在字符串中查找,并返回该查找结果的第一个值(数组),如果匹配失败,返回null.

如果执行exec方法的正则表达式没有分组(没有括号括起来的内容),那么如果有匹配,他将返回一个只有一个元素的数组,这个数组唯一的元素就是该正则表达式匹配的第一个串;如果没有匹配则返回null。
@例子1:下面两个alert函数弹出的信息是一样的:

JavaScript代码

   <script>    var str= "cat,hat" ;       var reg=/at/; //没有g属性       alert(reg.exec(str))       alert(str.match(reg))  

都是"at"。在这种场合下exec等价于match。但是如果正则表达式是全局匹配(g属性)的,那么以上代码结果不一样了:

@例子2:JavaScript代码

<script>var str= "cat,hat" ;   var reg=/at/g; //注意g属性  alert(reg.exec(str))   alert(str.match(reg))  <script>


分别是
"at"
"at,at"。

@例子3当存在子匹配的情况

<script>

    var str= "cas245ssdt,hs3at" ;  

         varreg=/s+(\d+)/g;  

         document.write(reg.exec(str)+"<br>"); 

         document.write(str.match(reg));</script>

@输出:s245,245

        s245,s3

@解释:第一行输出”s245,245”,是因为exec只会匹配第一个值(数组),而且由于表达式reg里有子表达式(即存在()),所有exec返回的数组有2个值,一个是表达式完全匹配的,一个是子表达式匹配的(即(\d+)),如果要方便取出可以这样写

  Var result = reg.exec(str);

             Document.write(“result[0]=”+ result[0]+”; result[1]=”+result[0]);

//@输出:result[0]=s245;result[1]=245

第2行由于表达式后面加了(g属性),全局匹配,所有输出所有的匹配值s245,s3


2.3 test

返回一个 Boolean 值,它指出在被查找的字符串中是否匹配给出的正则表达式。RegExp类的方法;


var objStr=newString("3e234234!");  var re = /^e\d+/;  // 必须以e开头var arr = re.test(objStr);//返回:falsevar re = /e\d+/;var arr = re.test(objStr);//返回:true


注意:test()继承正则表达式的lastIndex属性,表达式在匹配全局标志g的时候须注意。

代码如下:


function testDemo(){var r, re; // 声明变量。var s = "I";re = /I/ig; // 创建正则表达式模式。document.write(re.test(s) + "<br/>"); // 返回 Boolean 结果。document.write(re.test(s) + "<br/>");document.write(re.test(s));}testDemo(); 



输出结果:
true
false
true
当第二次调用test()的时候,lastIndex指向下一次匹配所在位置1,所以第二次匹配不成功,lastIndex重新指向0,等于第三次又重新匹配。下例显示test的lastIndex属性:
例子6:代码如下:


function testDemo(){var r, re; // 声明变量。var s = "I";re = /I/ig; // 创建正则表达式模式。document.write(re.test(s) + "<br/>"); // 返回 Boolean 结果。document.write(re.lastIndex); // 返回 Boolean 结果。}testDemo(); 



输出:
true
1
解决方法:将test()的lastIndex属性每次重新指向0,re.lastIndex = 0;

2.4 search

返回与正则表达式查找内容匹配的第一个子字符串的位置(偏移位)。0开始,没找到返回-1,与match一样是String 类的方法:stringObj.search(rgExp)

@例子:

<script>function SearchDemo(){var r, re; // 声明变量。var s = "The rain in Spain fallsmainly in the plain.";re = /the/i; // 创建正则表达式模式。re2 = /tom/i;r = s.search(re); // 查找字符串。r2 = s.search(re2);return("r:" + r +";r2:" + r2);}document.write(SearchDemo());</script>


 

@输出结果:r:0;r2:-1

2.5 replace

返回根据正则表达式进行文字替换后的字符串的复制。是String的方法

stringObj.replace(rgExp, replaceText);注意:replaceText可以是一个方法

 

@例子1替换为特定文字

<scriptlanguage="javascript">var s=prompt("请输入在查找的字符","人");var reg=/中华/g;var str="中华人民共2和国,中华人民共和234国";var newstr=str.replace(reg,"中国");document.write(newstr);</script>

@输出:中国人民共2和国,中国人民共和234国

@例子2匹配字符改颜色(数字改为红色)

<scriptlanguage="javascript">var s=prompt("请输入在查找的字符","人");var reg=/(\d)/g;var str="中华人民共2和国,中华人民共和234国";//$1是根据正则表达式里的()内容匹配的东西var newstr=str.replace(reg,"<fontcolor=red>$1</font>");document.write(newstr);</script>

@输出:

关于子匹配下下面的介绍:

(pattern)

匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,

在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。

要匹配圆括号字符,请使用“\(”或“\)”。

@例子3匹配内容修改

<scriptlanguage="javascript">var str="他今年22岁,她今年20岁,他的爸爸今年45岁,她的爸爸今年44岁,一共有4人"function test($0){var gyear=(new Date()).getYear()-parseInt($0)+1;     return $0+"("+gyear+"年出生)";}//var reg=new RegExp("(\\d+)岁","g");reg = /(\d+)岁/g;var newstr=str.replace(reg,test);document.write(newstr);</script>

@输出:

看到了吧,有了正则表达式你可以对内容为所欲为。

@例子4多匹配

<script>function f2c(s) {var test =/([\d]{4})-([\d]{1,2})-([\d]{1,2})/; return(s.replace(test,kk));}function kk($0,$1,$2,$3) {return($3+"/"+$2 +"/" +$1);}document.write("today:2011-03-29<br>");document.write(f2c("today:2011-03-29"));</script>


@输出:

注意:这里有$0\$1\$2\$3,这是由于表达式有(),表示表达式有子表达式。因为有3个问号所有有3个子表达式。

$0取的是跟表示式完全匹配的字符串

$1取的是第一个子表达试相匹配的字符串即2011

$2取的是第一个子表达试相匹配的字符串即03

$3取的是第一个子表达试相匹配的字符串即29

2.6 split

将一个字符串分割为子字符串,然后将结果作为字符串数组返回。
stringObj.split([separator[, limit]])
参数
stringObj
必选项。要被分解的 String 对象或文字。该对象不会被 split 方法修改。
separator
可选项。字符串或正则表达式 对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,返回包含整个字符串的单一元素数组。
limit
可选项。该值用来限制返回数组中的元素个数。

@例子:

<script>function SplitDemo(){var s, ss;var s = "The rain /.,/.in Spain fallsmainly in the plain.";// 正则表达式,用不分大不写的s进行分隔。ss = s.split(/\W+/i,5);//后面的5是可选项 表示只返回5个字符串return(ss);}document.write("原值:The rain/.,/.in Spain falls mainly in the plain.<br>");document.write("分解后:"+SplitDemo());</script>  

@输出:




原创粉丝点击