精通 JS正则表达式二

pc蛋蛋是一个积分换礼品平台
原文地址:http://www.iteye.com/topic/481228


贪婪量词与惰性量词 


•用贪婪量词进行匹配时,它首先会将整会字符串当成一个匹配,如果匹配的话就退出,如果不匹配,就截去最后一个字符进行匹配,如果不匹配,继续将最后一个字符截去进行匹配,直到有匹配为止。直到现在我们遇到的量词都是贪婪量词 
•用惰性量词进行匹配时,它首先将第一个字符当成一个匹配,如果成功则退出,如果失败,则测试前两个字符,依些增加,直到遇到合适的匹配为止 

惰性量词仅仅在贪婪量词后面加个"?"而已,如"a+"是贪婪匹配的,"a+?"则是惰性的 
Js代码
  1. var str = "abc";  
  2. var re = /\w+/;//将匹配abc  
  3. re = /\w+?/;//将匹配a  

多行模式 
Js代码
  1. var re = /[a-z]$/;  
  2.     var str = "ab\ncdef";  
  3.     alert(str.replace(re,"#"));//ab\ncde#  
  4.     re =/[a-z]$/m;  
  5.     alert(str.replace(re,"#"));//a#\ncde#  

分组与非捕获性分组 
Js代码
  1. re = /abc{2}/;//将匹配abcc  
  2. re = /(abc){2}/;//将匹配abcabc  
  3. //上面的分组都是捕获性分组  
  4. str = "abcabc ###";  
  5. arr = re.exec(str);  
  6. alert(arr[1]);//abc  
  7. //非捕获性分组 (?:)  
  8. re = /(?:abc){2}/;  
  9. arr = re.exec(str);  
  10. alert(arr[1]);//undefined  

候选(也就是所说的“或”) 
Js代码
  1. re = /^a|bc$/;//将匹配开始位置的a或结束位置的bc  
  2. str ="add";  
  3. alert(re.test(str));//true  
  4. re = /^(a|bc)$/;//将匹配a或bc  
  5. str ="bc";  
  6. alert(re.test(str));//true  

 当包含分组的正则表达式进行过test,match,search这些方法之后,每个分组都被放在一个特殊的地方以备将来使用,这些存储是分组中的特殊值,我们称之为反向引用 
Js代码
  1. var re = /(A?(B?(C?)))/;  
  2.   
  3. str = "ABC";  
  4. re.test(str);//反向引用被存储在RegExp对象的静态属性$1—$9中  
  5. alert(RegExp.$1+"\n"+RegExp.$2+"\n"+RegExp.$3);  
  6. //反向引用也可以在正则表达式中使用\1 ,\2...这类的形式使用  
  7. re = /\d+(\D)\d+\1\d+/;  
  8. str = "2008-1-1";  
  9. alert(re.test(str));//true  
  10. str = "2008-4_3";  
  11. alert(re.test(str));//false  

使用反向引用可以要求字符串中某几个位置上的字符必须相同.另外,在replace这类方法中可用特殊字符序列来表示反向引用 
Js代码
  1. re = /(\d)\s(\d)/;  
  2. str = "1234 5678";  
  3. alert(str.replace(re,"$2 $1"));//在这个里面$1表示第一个分组1234,$2则表示5678  

其它——〉正向前瞻,用来捕获出现在特定字符之前的字符,只有当字符后面跟着某个特定字符才去捕获它。与正向前瞻对应的有负向前瞻,它用匹配只有当字符后面不跟着某个特定字符时才去匹配它。在执行前瞻和负向前瞻之类的运算时,正则表达式引擎会留意字符串后面的部分,然而却不移动index 
Js代码
  1. //正向前瞻  
  2. re = /([a-z]+(?=\d))/i;  
  3. //我们要匹配后面跟一个数字的单词,然后将单词返回,而不要返回数字  
  4. str = "abc every1 abc";  
  5. alert(re.test(str));//true  
  6. alert(RegExp.$1);//every  
  7. alert(re.lastIndex);//使用前瞻的好处是,前瞻的内容(?=\d)并不会当成一次匹配,下次匹配仍从它开始  
  8. //负向前瞻(?!)  
  9. re = /([a-z](?!\d))/;i  
  10. //将匹配后面不包含数字的字母,并且不会返回(?!\d)中的内容  
  11. str = "abc1 one";  
  12. alert(re.test(str));  
  13. alert(RegExp.$1);//one  

构建一个验证电子邮箱地址有效性的正则表达式。电子邮箱地址有效性要求(我们姑且这样定义):用户名只能包含字母数字以及下划线,最少一位,最多25位,用户名后面紧跟@,后面是域名,域名名称要求只能包含字母数字和减号(-),并且不能以减号开头或结尾,然后后面是域名后缀(可以有多个),域名后缀必须是点号连上2-4位英文字母 
Js代码
  1. var re = /^\w{1,15}(?:@(?!-))(?:(?:[a-z0-9-]*)(?:[a-z0-9](?!-))(?:\.(?!-)))+[a-z]{2,4}$/;  

replace方法第二个参数作为函数的情况
读取一个文本文件中的字符串,统计其中的"9"出现的次数
Js代码
  1. var str="ADF9DF9DF9",//那个文本文件中的字符串;  
  2. re=/9/gi,//匹配9  
  3. counter=0;//计数器  
  4. str.replace(re,function () {  
  5. counter++;//每出现一次匹配,函数就被执行一次,函数的返回值用来替换原值  
  6. return "#";  
  7. });  
  8. //最后str 变成 ADF#DF#DF#"  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值