三爪的JS奋斗史--正规表达式
正则表达式
RegExp 对象的构造函数可以带一个或两个参数。
第一个参数(或只有一个参数) 是描述需要进行匹配的模式字符串
如果还有第二个参数,这个参数则制定了额外的处理指令
最基本的正则表达式
Var reCat = new RegExp(“cat”);
如果要让这个正则表达式匹配所有出现的cat就需要给构造函数第二个参数:
Var reCat = new RegExp(“cat”,”g”);
在上面哪行代码中g是global的缩写,表示要搜索字符中出现的全部 cat ,而不是在找到第一个匹配后就停止,
如果还要让模式不区分大小写,就可以给第二个参数添加字符 “i”
Var reCat = new RegExp(“cat”,”gi”);
Perl 风格的语法:
Var reCat = /cat/gi;
使用正则表达式
var a = "cat";
var cat = /cat/;
alert(cat.test(a)); return: true;
var a = "a bAt, a Cat, a cAt, a fat baT, a fat cat";
var cat = /at/gi;
var arratAt = a.match(cat); return: a字符串中的7个at存到了arratAt中了
var a = "a bAt, a Cat, a cAt, a fat baT, a fat cat";
var cat = /at/gi;
alert(a.search(cat)); return:3 是at第一次出现的位置
var a = "This is one!";
var one = /one/;
alert(a.replace(one,"two")); return:This is two; 替换
字符类
简单类:
var a = "a bAt, a Cat, a cAt, a fat baT, a fat cat";
var b = /[bcf]at/gi;
var c = a.match(b);
alert(c); return: bAt, Cat, cAt, fat baT, fat cat
负向类:
var a = "a bAt, a Cat, a cAt, a fat baT, a fat cat";
var b = /[^cf]at/gi;
var c = a.match(b);
alert(c); return: bAt,baT
范围类:
var a = "num1,num2,num3,num4,num5,num6,num7";
var b = /num[1-4]/gi;/*依然可以使用负向类*/
var c = a.match(b);
alert(c);
跳跃了。。。又回头写笔记了
. 除了换行与回车之外的任意字符
\d 数字
\D 非数字
\s 空白字符
\S 非空白字符
\w 单词字符(所有的字母 所有的数字和下划线)
\W 非单词字符
量词
? 出现零次或一次
* 出现零次或多次
+ 出现一次或多次
{N} 一定出现多少次
{n,m} 至少出现n次但不超过M次
{n,} 至少出现N次
贪婪的 惰性的 支配性的量词
贪婪 惰性 支配
? ?? ?+
* *? *+
+ +? ++
解释下贪婪 惰性 支配
贪婪就是从第一个检查字符串是否相符合,不符就减去最后一个字符,在进行检查,直至匹配或字符串减完
惰性就是一个一个检查,第一个检查不符就读下一个字符,再匹配
支配..就是遇见不对的,就切掉切掉= =!!!切掉就结束了
分组
用“( )”来进行分组
比如
Var reTag = /dogdog/g; 等于 var reTag = /(dog){2}/g;
也可以
Var re1 = /(dog)*/; Var re1 = /(dog)?/; Var re1 = /(dog)+/;
Var re4 = /([bd]ad?)*/;
Var reExtraSpace = /^\s*(.*?)\s*$/;
return this.replace(reTag,"$1");
书中的 Var reExtraSpace = /^\s*(.*?)\s*$/; 在" this is a women" 时,无法对第一个空格进行删除
$1 是反向引用。
反向引用是遵循从左到右
A.(1(2(3)))
B.(2(3))
C.(3)
$1是第一个反向引用,$2依次排
Var reDogDog = /(Dog)\1/ 等于 var reDogDog = /DogDog /;
Var sA = “1234 5678”;
Var reB = /(\d{4}) (\d{4}))/;
Var c = sA.replace(reB,”$2 $1”);
Alert(c); ruturn: 5678 1234;
前瞻与候选的结合DEMO.关键字屏蔽就是用的它….我试了几次..不错捏!!
var sToMatch1 = "我X你 , 我X他";
var reBed = /(我X(?=你|他))/g;
var show = sToMatch1.replace(reBed,"**");
alert(show);
邪恶的DEMO
非捕获性分组: ?:
创建反向引用的分组 称为捕获性分组
非捕获性分组不会创建反向引用,因为在较长的表达式中,创建反向引用会降低匹配速度。
边界:^ 行开头 $行结尾
\b单词的边界(中文无效) \B非单词的边界
多行模式:var reLastWordOnLine = /(\w+)$/gm;
实例
验证日期
var reDay = /?:0[1-9]|[12][0-9]|3[01]/;
var remonth = /?:0[1-9]|1[0-2]/;
var reYear = /?:19|20\d{2}/;
验证Email
var reEmail = /^(?:\w+\.?)*\w+@(?:\w+\.?)*\w+$/;
浙公网安备 33010602011771号