Javascript正则表达式

来源:互联网 发布:厨房用品知乎 编辑:程序博客网 时间:2024/06/02 00:50


◆为什么需要正则表达式

问题:

1.给你一个字符串(或一篇文章),请你找出所有四个数字两在一起的子串,并且这四个数字要满足:第一位与第四位相同,第二位与第三位相同,比如:1221   4884....

2.比如验证电子邮件,身份证格式,是不是数字,长度,要求等。


如何解决上述问题呢,js设计者提供了新的技术:正则表达式(RegExp对象,全称regul expression)。


正则表达式并不是js的专利,很多语言都支持正则表达式,用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串,很多工具里,正则表达式被用来检索或者替换那些符合某个模式的文本内容。


◆基本概念:

正则表达式,就是用某种模式去匹配一类字符串的公式,反映到我们的js中,它就是一个RegExp对象。


快速入门案例:

<!DOCTYPE html>
<html>
  <head>
    <title>reggexp1.html</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
<script type="text/javascript">


function test1(){
//得到用户的内容
var con=content.innerText;
var myReg=/(\d){4}/gi; //这是一个正则表达式,可以检索四个连续数字组成的字符串
//var myReg=new RegExp("(\\d){4}","gi");//这是正则表达式的显式创建,等价于上一行,正则表达式当作字符串输出,所以\d  这里,要加一个\ 来转意,不然无效。
while(res=myReg.exec(con)){//res是检索出来的结果,但是一个结果对应的是一个数组,该数组的第一个元素,即res[0],是找到的那个文本
window.alert("找到"+res);
}
}
</script>
  </head>
  <body>
    <textarea id="content" rows="20" cols="40"></textarea>
    <input type="button" value="测试" onclick="test1()"/>
  </body>
</html>


小结:

1.创建一个RegExp对象,有两种方法:

(1)隐式创建 var reg=/正则表达式/gi     

注意:1.g表示全局匹配【在整个字符串里边】查找;  

   2.i表示是否区分大小写,如果有i,则表示不区分大小写,若去掉i,则区分大小写。

   3.m用作多行标志。m考虑了换行:一段字符串中可能会有多段,其中换了行。如果没有m,默认只在第一段查找。有了m换行了也能够查找下边的行。用的不多。

(2)显示创建   var reg=new RegExp("正则表达式")



String对象和正则表达式相关的方法:

1.test()    判断正则表达式有没有找到匹配的值,找到返回true,没有找到返回false

 var str="Visit W3School!";
 window.alert(str.search(/W3School/));//用这个正则表达式在这个字串里边搜索,返回找到的第一个符合该表达式的字串的位置,返回了6,就是下标为6的字符,从0开始的。


2.match

案例:

function test1(){
var con=content.innerText;
var myreg=/abc/gi;
res=con.match(myreg);
for(var i=0;i<res.length;i++){
window.alert(i+" "+res[0]);
}
}


3.replace   替换

replace(正则表达式,“换成什么东西”)

案例:

function test3(){
var con=content.innerText;
var myReg=/(\d){4}/gi;
//把四个数字,换成  这里原来有四个数字
var newCon=con.replace(myReg,"这里原来有四个数字");
content.innerText=newCon;
}

4.split  之前讲过,根据符号分割字符串


5.index:当前表达式首次匹配内容的开始位置,从0开始计数

leftContext:当前表达式最后一个匹配字符串左边的所有内容

rightContext:当前表达式最后一个匹配字符串右边的所有内容

案例:

//index,leftContext,rightContext
function test4(){
var con=content.innerText;
var myReg=/(\d){4}/gi;
while(res=myReg.exec(con)){
window.alert("index="+RegExp.index+" "+"left="+RegExp.leftContext+" "+"right="+RegExp.rightContext);
}
}


◆重点:正则表达式的子表达式,捕获和反向引用

案例:

//给你一个字符串或一篇文章,请你找出所有四个数字连在一起的子串
//并且这四个数字要满足:1第一位与第四位相同2.第二位与第三位相同
//比如1221    5775

理解图:


简单理解为:运行时,先用(\d)这个子表达式捕获了两个任意数字,然后\2表示反向引用第二个子表达式捕获的内容,\1表示反向引用第一个子表达式捕获的内容。也就可以看作,每次用这个正则表达式筛选的时候,首先会捕获两个数字ab,然后正则表达式的第三位变成第二个数字b,第四位变成第一个数字a,整个正则表达式表示为abba,然后再判断是不是符合正则表达式。


代码:

function test5(){
var con=content.innerText;
//
var myReg=/(\d)(\d)\2\1/gi;
while(res=myReg.exec(con)){
window.alert(res[0]);
}
}


那么,请思考aabbccdd的正则表达式

答案为:/(\d)\1(\d)\2(\d)\3(\d)\4/gi

注意:这里的1,2,3,4表示的是第几个子表达式捕获的内容而不是第几位,所以这里是1,2,3,4而不是1,3,5,7。


接下来写,12345-333999111  这样的号码的正则表达式,要求满足:前面是一个任意的五位数,然后一个-号,然后是一个九位数,连续的每三位要相同

表达式为:/(\d){5}-(\d)\2\2(\d)\3\3(\d)\4\4/gi




◆限定式

1.   a{n}  即a连续出现n次

比如,当1{3}来匹配1111111的时候,结果是什么? 

答案是:111 111   。

当匹配到第一个之后,从匹配后的第一个继续开始匹配。  

2.  {n,m}  n表示至少出现n次最多出现m次。

比如,当  1{3,4} 去匹配1111111的话,会得到什么结果呢?

答案是: 1111  111  

js在默认匹配中使用贪婪匹配原则,即尽可能匹配多的字符串。在上边的案例中,能匹配4个,就匹配4个,不能的时候才匹配3个。

3.  +  表示出现1次到任意多次

比如:当/1+/gi  去匹配1111111的话,会得到什么结果呢?

答案:1111111

贪婪匹配原则,能多匹配,就多匹配。

4.  *  表示出现0次到任意多次

比如,当用/a1*/gi  去匹配a111的话,会得到什么结果呢?

答案是 a111

贪婪匹配。

5.  ? 问号表示出现0到1次

比如,当用/a1?/gi   去匹配a111的话,会得到什么结果呢?

答案是: a1

当用/a1?/gi   去匹配a的话,会得到什么结果呢?

答案是:a

6.  [a-z]   表示可以匹配a-z中任意一个字符

比如,当用[a-z]去匹配abcd,则会返回4个值a,b,c,d;当用[a-z]{4}去匹配abcd,则会返回一个值abcd。若用[a-z]?去匹配abcd,则会返回5个值,a,b,c,d,空,因为有?号,所以出现0次的时候也会返回一下。

7.  [^a-z]   表示可以匹配不是a-z中的任意一个字符,即取反

8.  [abcd] 表示可以匹配abcd中的任意一个字符

9.其他:


思考:编写一个正则表达式,可以匹配任意三个连续的字符:

答案为:/[\s\S]\1{2}/gi       [\s\S]表示空白加上非空白,也就是全部字符,同理可以用D,W来做,\1就是捕获这个字符,{2}表示再出现两次,一共就是3个了。这里的次数是这样么?不确定


10.定位符   用于规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置。这个很有用。

  ^  符号说明:匹配目标字符串的开始位置。一定要在开头的位置,若前边有东西则不匹配。。

   注意:^这个好好在[]的包括中,才表示"非"

  $  符号说明:匹配目标字符串的结束位置。一定要在结尾的位置,若后边有东西则不匹配。

    注意:$如果出现的话跟在后边



11.转意符号:


找上边几种字符的时候,要用 \ 进行转意


12.选择匹配符

    |   有时候我们可以匹配某个字符串是选择性的,即:既可以匹配这个,又可以匹配那个,此时就可以用选择匹配符。相当于   或。



综合案例:

验证电子邮件格式是否合法:

要求:1.只能有一个@  2.@前边是用户名,可以使字母、数字和_-字符  3.@后边是域名,可以使sohu.com或者tsinghua.org.cn并且域名只能是英文字母。


正则表达式为:/^[0-9A-Za-z-_]+@([a-zA-Z0-9]+\.)[com||org|cn|net]$/gi


解释:其中,^[0-9A-Za-z-_]+是用户名,表示数字字母_ -这些符号要出现一次或多次且以他们开头;@不用转意直接写;([a-zA-Z0-9]+\.)+是域名和  .  ;[com||org|cn|net]$表示必须要以这些结尾。







0 0
原创粉丝点击