一Q概q?/p>
1Q正则表辑ּQ可以说是Q何一U编E语a都提供的机制Q它主要是提供了对字W串的处理能力?br />
2Q正则表辑ּ在页面处理中的用场景:
1Q表单验证。验证某些域W合某种规则Q例如邮件输入框必须输入的是邮g、联pȝ话输入框输入的必L数字{等
2Q处理DOM模型。例如通过表达式定位DOM中的一个对象或一pd对象Q一个例子就是定位id属性中含有某个Ҏ字符的div对象?br />
3Q纯~程逻辑。直接用于编E的逻辑之中?br />
3Q说明:本部分所丄正则表达式的代码片断Q都是经q测试的Q但有一炚w要注意,对于换行的字W串的定义,我们在表q时使用的是cM如下的Ş式:
var str=“It’s is
a beautiful city”Q?br />
q种形式直接写在JS代码中是错误的,那如何获取具有换行的字符串呢Q简单的办法Q在textarea中输入文本ƈ换行Q然后将该DlJS变量卛_。例如:
var str=document.forms[0].mytextarea.value;
二,语法与?/p>
1Q定义正则表辑ּ
1Q定义正则表辑ּ有两UŞ式,一U是普通方式,一U是构造函数方式?br />
2Q普通方式:var reg=/表达?附加参数
表达式:一个字W串Q代表了某种规则Q其中可以用某些特D字W,来代表特D的规则Q后面会详细说明?br />
附加参数Q用来扩展表辑ּ的含义,目前主要有三个参敎ͼ
gQ代表可以进行全局匚w?br />
iQ代表不区分大小写匹配?br />
mQ代表可以进行多行匹配?br />
上面三个参数Q可以Q意组合,代表复合含义Q当然也可以不加参数?br />
例子Q?br />
var reg=/a*b/;
var reg=/abc+f/g;
3Q构造函数方式:var reg=new RegExp(“表达?#8221;,”附加参数”);
其中“表达?#8221;?#8220;附加参数”的含义与上面那种定义方式中的含义相同?br />
例子Q?br />
var reg=new RegExp(“a*b”);
var reg=new RegExp(“abc+f”,”g”);
4Q普通方式与构造函数方式的区别
普通方式中的表辑ּ必须是一个常量字W串Q而构造函C的表辑ּ可以是常量字W串Q也可以是一个js变量Q例如根据用L输入来作辑ּ参数{等Q?br />
var reg=new RegExp(document.forms[0].exprfiled.value,”g”);
2Q表辑ּ模式
1Q表辑ּ模式Q是指表辑ּ的表达方式与样式Q??var reg=/表达?附加参数 中的“表达?#8221;怎样Lqͼ
2Q从规范上讲Q表辑ּ模式分ؓ单模式和复合模式?br />
3Q简单模式:是指通过普通字W的l合来表辄模式Q例?br />
var reg=/abc0d/;
可见单模式只能表C具体的匚w?br />
4Q复合模式:是指含有通配W来表达的模式,例如Q?br />
var reg=/a+b?\w/;
其中??和\w都属于通配W,代表着Ҏ的含义。因此复合模式可以表达更为抽象化的逻辑?br />
下面我们着重说一下复合模式中各个通配W的含义及其使用?br />
5)复合模式中特D字W的讲解Q?/p>
1>\Q在许多~程语言里面被用作{义符Q一般来?br />
\W号后面如果跟的是普通字WcQ那么\c׃表特D的含义Q例如n本来代表字符nQ但\n׃表换行?br />
\W号后面如果跟的是特D字WcQ那么\c׃表普通字WcQ例如\一般用作{义符Q但\\则调表普通字W\?br />
Javascript的正则表辑ּ中\的用法与上面相同Q只是不同的~程语言Q特D字W表可能不太一LŞ了?/p>
2>^Q匹配输入字W串的v始端Q如果是多行匚wQ即表达式的附加参数中含有mQ则也在一个换行符后匹配?br />
例子Q?^B/匚w “Bab Bc ”中的W一个B
例子2Q?^B/gm匚w
“Badd B
cdaf
B dsfB”
中的W一行第一个BQ第三行中的W一个B
3>$Q匹配输入字W创的尾端,如果是多行匹配,卌辑ּ的附加参C含有mQ则也在一个换行符前匹配?br />
与^的用法相反?br />
例子Q?t$/匚w“bat”中的tQ但是不匚w“hate”中的t
例子2Q?t$/匚w
“tag at
bat”
中第一行的最后一个t和第二行的t?/p>
4>*Q匹配前一个字W?ơ或多次?br />
例子Q?ab*/匚w“dddabbbbc”中的“abbbb”Q也匚w“ddda”中的“a”
5>+Q匹配前一个字W?ơ或多次?br />
例子Q?ab+/匚w“dddabbbbc”中的“abbbb”Q但不匹?#8220;ddda”
与后面的{1,}Q原型:{n,}Q的用法cM
6>?Q?的用法比较特D,一般来说它用来对前一个字W做0ơ或1ơ匹配,但是它有另外两种Ҏ的用法:
如果紧跟???和{ }之后Q则表示原始匚w的最次数匹配,例如Q?br />
/ba*/本来匚w“bbbaaaa”中的“baaaa”Q但?ba*?/则匹?#8220;bbbaaaa”中的“b”Q因?表示0ơ或多次匚wQ而加?应该表示最次数匹配,?ơ匹配)?br />
同理Q?ba+?/则匹?#8220;baaaa”中的“ba”?br />
作ؓ语法l构W号Q用于前置断言中,卛_面要说到的x(?=y)和x(?!=y)
7>.Q小数点中的“.”P匚wM一个单独的字符Q但是换行符除外?br />
标准中d有哪些字W?请参考:字符?br />
例如Q?a.b/匚w“acbaa”中的“acb”Q但是不匚w“abbb”?/p>
8>(x)Q表C匹配x(qҎ字符x或者特指一个字W,x表示一个字W串)Q而且匚w会被CQ在语法中这U?)被称?#8220;capturing parentheses ”Q即捕捉用的括受?br />
匚w会被CQ是因ؓ在表辑ּ提供的函CQ有些函数返回一个数l,该数l会保存所匚w的所有字W串Q例如exec()函数?br />
另外q要注意()中的x被记住的前提是匹配x?br />
例子1Q?br />
var regx=/a(b)c/;
var rs=regx.exec(“abcddd”);
从上面可以看?/a(b)c/匚w“abcddd”中的“abc”Q因?)的原因,b也会记录下来Q因此rsq回的数字内容ؓQ?br />
{abc,b}
例子2Q?br />
var regx=/a(b)c/;
var rs=regx.exec(“acbcddd”);
rsq回nullQ因?a(b)c/不匹?#8220;acbcddd”Q所?)中的b不会被记录下来(管字符串中含有bQ?br />
9>(?:x)Q匹配xQ但不会CxQ这U格式中?)被称?#8220;non-capturing parentheses ”Q即非捕捉用的小括号?br />
例子Q?br />
var regx=/a(?:b)c/;
var rs=regx.exec(“abcddd”);
从上面可以看?/a(?:b)c/匚w“abcddd”中的“abc”Q因??:)的原因,b不会记录下来Q因此rsq回的数字内容ؓQ?br />
{abc}
10>X(?=y)Q匹配xQ仅当后面紧跟着y时。如果符合匹配,则只有x会被CQy不会被记住?br />
例子Q?br />
var regx=/user(?=name)/;
var rs=regx.exec(“The username is Mary”);
l果Q匹配成功,而且rs的gؓ{user}
11>X(?!y)Q匹配xQ仅当后面不紧跟着y时。如果符合匹配,则只有x会被CQy不会被记住?br />
例子Q?br />
var regx=/user(?!name)/;
var rs=regx.exec(“The user name is Mary”);
l果Q匹配成功,而且rs的gؓ{user}
例子2Q?br />
var regx=/\d+(?!\.)/;
var rs=regx.exec(“54.235”);
l果Q匹配成果,rs的gؓ{5}Q不匚w54是因?4后面跟着“.”P当然235也匹配,但是׃execҎ的行为,235不会被返?/p>
12>x|yQ匹配x或y。注意如果x和y都匹配上了,那么只记住x?br />
例子Q?br />
var regx=/beijing|shanghai/;
var rs=regx.exec(“I love beijing and shanghai”);
l果Q匹配成功,rs的gؓ{beijing}Q虽然shanghai也匹配,但不会被C?/p>
13>{n}Q匹配前一个字W的nơ出现?br />
n必须是一个非负数Q当然如果是一个负数或数也不会报语法错误?br />
例子Q?br />
var regx=/ab{2}c/;
var rs=regx.exec(“abbcd”);
l果Q匹配成功,rs的gؓQ{abbc}?/p>
14>{n,}Q匹配前一个字W的臛_nơ出现?br />
例子Q?br />
var regx=/ab{2,}c/;
var rs=regx.exec(“abbcdabbbc”);
l果Q匹配成功,rs的gؓQ{abbc}。注意ؓ什么abbbc也符合条件ؓ什么没有被CQ这与execҎ的行为有养I后面会统一讲解?/p>
15>{n,m}Q匹配前一个字W的臛_nơ最多mơ的出现?br />
只要n与m为数字,而且m>=n׃会报语法错误?br />
例子Q?br />
var regx=/ab{2,5}c/;
var rs=regx.exec(“abbbcd”);
l果Q匹配成功,rs的gؓQ{abbbc}?br />
例子2Q?br />
var regx=/ab{2,2}c/;
var rs=regx.exec(“abbcd”);
l果Q匹配成功,rs的gؓQ{abbc}?br />
例子3Q?br />
var regx=/ab(2,5)/;
var rs=regx.exec(“abbbbbbbbbb”);
l果Q匹配成功,rs的gؓQ{abbbbb}Q这说明Q如果前一个字W出现多于mơ,则只匚wmơ。另外:
var regx=/ab(2,5)c/;
var rs=regx.exec(“abbbbbbbbbbc”);
l果Q匹配失败,rs的gؓQnullQؓ什么匹配失败,因ؓb多于5个则b(2,5)会匹配前5个bQ,而表辑ּ/ab(2,5)c/中b后面是cQ但字符串中5个b之后q是b所以会报错?/p>
16>[xyz]Qxyz表示一个字W串Q该模式表示匚w[]中的一个字W,形式上[xyz]{同于[x-z]?br />
例子Q?br />
var regx=/a[bc]d/;
var rs=regx.exec(“abddgg”);
l果Q匹配成功,rs的gؓQ{abd}
例子2Q?br />
var regx=/a[bc]d/;
var rs=regx.exec(“abcd”);
l果Q匹配失败,rs的gؓQnullQ之所以失败,是因为[bc]表示匚wb或c中的一个,但不会同时匹配?/p>
17>[^xyz]Q该模式表示匚w非[]中的一个字W,形式上[^xyz]{同于[^x-z]?br />
例子Q?br />
var regx=/a[^bc]d/;
var rs=regx.exec(“afddgg”);
l果Q匹配成功,rs的gؓQ{afd}
例子2Q?br />
var regx=/a[^bc]d/;
var rs=regx.exec(“abd”);
l果Q匹配失败,rs的gؓQ?/p>
18>[\b]Q匹配退格键?/p>
19>\bQ匹配一个词的边界符Q例如空格和换行W等{,当然匚w换行W时Q表辑ּ应该附加参数m?br />
例子Q?br />
var regx=/\bc./;
var rs=regx.exec(“Beijing is a beautiful city”);
l果Q匹配成功,rs的gؓQ{ci}Q注意c前边的空g会匹配到l果中,即{ ci}是不正确的?/p>
20>\BQ代表一个非单词边界?br />
例子Q?br />
var regx=/\Bi./;
var rs=regx.exec(“Beijing is a beautiful city”);
l果Q匹配成功,rs的gؓQ{ij}Q即匚w了Beijing中的ij?/p>
21>\cXQ匹配一个控制字W。例如, \cM 匚w一?Control-M ?
回RW?x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一
个原义的 ’c’ 字符。(实际的例子还需补充Q?/p>
21>\dQ匹配一个数字字W,{同于[0-9]?br />
例子Q?br />
var regx=/user\d/;
var rs=regx.exec(“user1”);
l果Q匹配成功,rs的gؓQ{user1}
22>\DQ匹配一个非数字字符Q等同于[^0-9]?br />
例子Q?br />
var regx=/user\D/;
var rs=regx.exec(“userA”);
l果Q匹配成功,rs的gؓQ{userA}
23>\fQ匹配一个换늬?/p>
24>\nQ匹配一个换行符。因为是换行W,所以在表达式中要加入m参数?br />
例子Q?br />
var regx=/a\nbc/m;
var str=“a
bc”;
var rs=regx.exec(str);
l果Q匹配成功,rs的gؓQ{ }Q如果表辑ּ?a\n\rbc/Q则不会被匹配,因此在一般的~辑器中一?#8221;Enter”键代表着“回R换行”Q而非“换行回R”Q至在textarea域中是这L?nbsp;
25>\rQ匹配一个回车符
26>\sQ匹配一个空格符Q等同于[ \f\n\r\t\v\u00A0\u2028\u2029].
例子Q?br />
var regx=/\si/;
var rs=regx.exec(“Beijing is a city”);
l果Q匹配成功,rs的gؓQ{ i}
27>\SQ匹配一个非I格W,{同于[ ^\f\n\r\t\v\u00A0\u2028\u2029].
例子Q?br />
var regx=/\Si/;
var rs=regx.exec(“Beijing is a city”);
l果Q匹配成功,rs的gؓQ{ei}
28>\tQ匹配一个tab
例子Q?br />
var regx=/a\tb/;
var rs=regx.exec(“a bc”);
l果Q匹配成功,rs的gؓQ?{a bc}
29>\vQ匹配一个竖向的tab
30>\wQ匹配一个数字、_或字母表字符Q即[A-Za-z0-9_ ]?br />
例子Q?br />
var regx=/\w/;
var rs=regx.exec(“$25.23”);
l果Q匹配成功,rs的gؓQ{2}
31>\WQ匹配一个非数字、_或字母表字符Q即[^A-Za-z0-9_ ]?br />
例子Q?br />
var regx=/\w/;
var rs=regx.exec(“$25.23”);
l果Q匹配成功,rs的gؓQ{$}
32>\nQ注意不是\nQ这里n是一个正整数Q表C匹配第n?)中的字符?br />
例子Q?br />
var regx=/user([,-])group\1role/;
var rs=regx.exec(“user-group-role”);
l果Q匹配成功,rs的gؓQ{user-group-role,-}Q同样对user,group,role的匹配也是成功的Q但像user-group,role{就不对了?/p>
33>\0Q匹配一个NUL字符?/p>
34>\xhhQ匹配一个由两位16q制数字所表达的字W?/p>
35>\uhhhhQ匹配一个由四位16q制数字所表达的字W?/p>
3Q表辑ּ操作
1Q表辑ּ操作Q在q里是指和表辑ּ相关的方法,我们介l六个方法?br />
2Q表辑ּ对象QRegExpQ方法:
1>exec(str)Q返回str中与表达式相匚w的第一个字W串Q而且以数l的形式表现Q当然如果表辑ּ中含有捕捉用的小括号Q则q回的数l中也可能含?)中的匚w字符Ԍ例如Q?br />
var regx=/\d+/;
var rs=regx.exec(“3432ddf53”);
q回的rsgؓQ{3432}
var regx2=new RegExp(“ab(\d+)c”);
var rs2=regx2.exec(“ab234c44”);
q回的rsgؓQ{ab234c,234}
另外Q如果有多个合适的匚wQ则W一ơ执行execq回一个第一个匹配,此时l箋执行execQ则依次q回W二个第三个匚w。例如:
var regx=/user\d/g;
var rs=regx.exec(“ddduser1dsfuser2dd”);
var rs1=regx.exec(“ddduser1dsfuser2dd”);
则rs的gؓ{user1}Qrs的gؓ{rs2}Q当然注意regx中的g参数是必ȝQ否则无论exec执行多少ơ,都返回第一个匹配。后面还有相兛_Ҏ及到Ҏ惌的解释?/p>
2>test(str)Q判断字W串str是否匚w表达式,q回一个布倹{例如:
var regx=/user\d+/g;
var flag=regx.test(“user12dd”);
flag的gؓtrue?/p>
3QString对象Ҏ
1>match(expr)Q返回与expr相匹配的一个字W串数组Q如果没有加参数gQ则q回W一个匹配,加入参数g则返回所有的匚w
例子Q?br />
var regx=/user\d/g;
var str=“user13userddduser345”;
var rs=str.match(regx);
rs的gؓQ{user1,user3}
2>search(expr)Q返回字W串中与expr相匹配的W一个匹配的index倹{?br />
例子Q?br />
var regx=/user\d/g;
var str=“user13userddduser345”;
var rs=str.search(regx);
rs的gؓQ?
3>replace(expr,str)Q将字符串中匚wexpr的部分替换ؓstr。另外在replaceҎ中,str中可以含有一U变量符?Q格式ؓ$nQ代表匹配中被记住的Wn的匹配字W串Q注意小括号可以记忆匚wQ?br />
例子Q?br />
var regx=/user\d/g;
var str=“user13userddduser345”;
var rs=str.replace(regx,”00”);
rs的gؓQ?03userddd0045
例子2Q?br />
var regx=/u(se)r\d/g;
var str=“user13userddduser345”;
var rs=str.replace(regx,”$1”);
rs的gؓQse3userdddse45
对于replace(expr,str)Ҏq要特别注意一点,如果expr是一个表辑ּ对象则会q行全局替换Q此时表辑ּ必须附加参数gQ否则也只是替换W一个匹配)Q如果expr是一个字W串对象Q则只会替换W一个匹配的部分Q例如:
var regx=“user”
var str=“user13userddduser345”;
var rs=str.replace(regx,”00”);
rs的gؓQ?0013userddduser345
4>split(expr)Q将字符串以匚wexpr的部分做分割Q返回一个数l,而且表达式是否附加参数g都没有关p,l果是一L?br />
例子Q?br />
var regx=/user\d/g;
var str=“user13userddduser345”;
var rs=str.split(regx);
rs的gؓQ{3userddd,45}
4Q表辑ּ相关属?/p>
1Q表辑ּ相关属性,是指和表辑ּ相关的属性,如下面的形式Q?br />
var regx=/myexpr/;
var rs=regx.exec(str);
其中Q和表达式自wregx相关的属性有两个Q和表达式匹配结果rs相关的属性有三个Q下面将逐一介绍?br />
2Q和表达式自w相关的两个属性:
1>lastIndexQ返回开始下一个匹配的位置Q注意必L全局匚wQ表辑ּ中带有g参数Q时QlastIndex才会有不断返回下一个匹配|否则该gؓLq回W一个下一个匹配位|,例如Q?br />
var regx=/user\d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var lastIndex1=regx.lastIndex;
rs=regx.exec(“sdsfuser1dfsfuser2”);
var lastIndex2=regx.lastIndex;
rs=regx.exec(“sdsfuser1dfsfuser2”);
var lastIndex3=regx.lastIndex;
上面lastIndex1?Q第二个lastIndex2也ؓ9Q第三个也是9Q如果regx=/user\d/gQ则W一个ؓ9Q第二个?8Q第三个??/p>
2>sourceQ返回表辑ּ字符串自w。例如:
var regx=/user\d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var source=regx.source;
source的gؓuser\d
3Q和匚wl果相关的三个属性:
1>indexQ返回当前匹配的位置。例如:
var regx=/user\d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var index1=rs.index;
rs=regx.exec(“sdsfuser1dfsfuser2”);
var index2=rs.index;
rs=regx.exec(“sdsfuser1dfsfuser2”);
var index3=rs.index;
index1?Qindex2?Qindex3?Q如果表辑ּ加入参数gQ则index1?Qindex2?3Qindex3会报错(index为空或不是对象)?/p>
2>inputQ用于匹配的字符丌Ӏ例如:
var regx=/user\d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var input=rs.input;
input的gؓsdsfuser1dfsfuser2?/p>
3>[0]Q返回匹配结果中的第一个匹配|对于match而言可能q回一个多值的数字Q则除了[0]外,q可以取[1]、[2]{等。例如:
var regx=/user\d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var value1=rs[0];
rs=regx.exec(“sdsfuser1dfsfuser2”);
var value2=rs[0];
value1的gؓuser1,value2的gؓuser2
5Q实际应?/p>
1Q实际应用一
描述Q有一表单Q其中有一?#8220;用户?#8221;input?br />
要求Q汉字,而且不能于2个汉字,不能多于4个汉字?br />
实现Q?br />
<script>
function checkForm(obj){
var username=obj.username.value;
var regx=/^[\u4e00-\u9fa5]{2,4}$/g
if(!regx.test(username)){
alert(“Invalid username!”);
return false;
}
return true;
}
</script>
<form name=“myForm”onSubmit=“return checkForm(this)”>
<input type=“text” name=“username”/>
<input type=“submit” vlaue=“submit”/>
</form>
2Q实际应用二
描述Q给定一个含有html标记的字W串Q要求将其中的html标记L?br />
实现Q?br />
<script>
function toPlainText(htmlStr){
var regx=/<[^>]*>|<\/[^>]*>/gm;
var str=htmlStr.replace(regx,"");
return str;
}
</script>
<form name=“myForm”>
<textarea id=“htmlInput”></textarea>
<input type=“button” value=“submit” onclick=“toPlainText(document.getElementById(‘htmlInput’).value”/>
</form>
三,结
1QJavascript正则表达式,我想在一般的E序员之中,使用者应该不是很多,因ؓ我们处理的页面一般都不是很复杂,而复杂的逻辑一般我们都在后台处理完成了。但是目前趋势已l出C扭{Q富客户端已l被来多的h接受Q而Javascript是其中的关键技术,对于复杂的客L逻辑而言Q正则表辑ּ的作用也是很关键的,同时它也是Javascript高手必须要掌握的重要技术之一?/p>
2Qؓ了能够便于大家对前面讲述的内Ҏ一个更为综合和深刻的认识,我将前面的一些关键点和容易犯p涂的地方再pȝȝ一下,q部分很关键Q?br />
ȝ1Q附件参数g的用?br />
表达式加上参数g之后Q表明可以进行全局匚wQ注意这?#8220;可以”的含义。我们详l叙qͼ
1Q对于表辑ּ对象的execҎQ不加入gQ则只返回第一个匹配,无论执行多少ơ均是如此,如果加入gQ则W一ơ执行也q回W一个匹配,再执行返回第二个匚wQ依ơ类推。例?br />
var regx=/user\d/;
var str=“user18dsdfuser2dsfsd”;
var rs=regx.exec(str);//此时rs的gؓ{user1}
var rs2=regx.exec(str);//此时rs的g然ؓ{user1}
如果regx=/user\d/gQ则rs的gؓ{user1}Qrs2的gؓ{user2}
通过q个例子说明Q对于execҎQ表辑ּ加入了gQƈ不是说执行execҎ可以返回所有的匚wQ而是说加入了g之后Q我可以通过某种方式得到所有的匚wQ这里的“方式”对于exec而言Q就是依ơ执行这个方法即可?br />
2Q对于表辑ּ对象的testҎQ加入g于不加上g没有什么区别?br />
3Q对于String对象的matchҎQ不加入gQ也只是q回W一个匹配,一直执行matchҎ也Lq回W一个匹配,加入gQ则一ơ返回所有的匚wQ注意这与表辑ּ对象的execҎ不同Q对于exec而言Q表辑ּ即加上了gQ也不会一ơ返回所有的匚wQ。例如:
var regx=/user\d/;
var str=“user1sdfsffuser2dfsdf”;
var rs=str.match(regx);//此时rs的gؓ{user1}
var rs2=str.match(regx);//此时rs的g然ؓ{user1}
如果regx=/user\d/gQ则rs的gؓ{user1,user2}Qrs2的g为{user1,user2}
4Q对于String对象的replaceҎQ表辑ּ不加入gQ则只替换第一个匹配,如果加入gQ则替换所有匹配。(开头的三道试题能很好的说明这一点)
5Q对于String对象的splitҎQ加上g与不加g是一LQ即Q?br />
var sep=/user\d/;
var array=“user1dfsfuser2dfsf”.split(sep);
则array的gؓ{dfsf, dfsf}
此时sep=/user\d/gQ返回值是一L?br />
6Q对于String对象的searchҎQ加不加g也是一L?br />
ȝ2Q附加参数m的用?br />
附加参数mQ表明可以进行多行匹配,但是q个只有当用^?模式时才会v作用Q在其他的模式中Q加不加入m都可以进行多行匹配(其实说多行的字符串也是一个普通字W串Q,我们举例说明q一?br />
1Q用^的例?br />
var regx=/^b./g;
var str=“bd76 dfsdf
sdfsdfs dffs
b76dsf sdfsdf”;
var rs=str.match(regx);
此时加入g和不加入gQ都只返回第一个匹配{bd}Q如果regx=/^b./gmQ则q回所有的匚w{bd,b7}Q注意如果regx=/^b./mQ则也只q回W一个匹配。所以,加入m表明可以q行多行匚wQ加入g表明可以q行全局匚wQ综合到一起就是可以进行多行全局匚w
2Q用其他模式的例子Q例?br />
var regx=/user\d/;
var str=“sdfsfsdfsdf
sdfsuser3 dffs
b76dsf user6”;
var rs=str.match(regx);
此时不加参数gQ则q回{user3}Q加入参数gq回{user3,user6}Q加不加入mҎ没有影响?br />
3Q因此对于m我们要清楚它的用,C它只对^?模式起作用,在这两种模式中,m的作用ؓQ如果不加入mQ则只能在第一行进行匹配,如果加入m则可以在所有的行进行匹配。我们再看一个^的例?br />
var regx=/^b./;
var str=“ret76 dfsdf
bjfsdfs dffs
b76dsf sdfsdf”;
var rs=str.match(regx);
此时rs的gؓnullQ如果加入gQrs的g然ؓnullQ如果加入mQ则rs的gؓ{bj}Q也是_在第一行没有找到匹配,因ؓ有参数mQ所以可以l去下面的行L是否有匹配)Q如果m和g都加上,则返回{bj,b7}Q只加m不加g说明Q可以去多行q行匚wQ但是找C个匹配后p回,加入g表明多行中所有的匚wq回Q当然对于matchҎ是如此,对于exec呢,则需要执行多ơ才能依ơ返回)
ȝ3Q在HTML的textarea输入域中Q按一个Enter键,对应的控制字Wؓ“\r\n”Q即“回R换行”Q而不?#8220;\n\r”Q即“换行回R”Q我们看一个前面我们Dq的例子Q?br />
var regx=/a\r\nbc/;
var str=“a
bc”;
var rs=regx.exec(str);
l果Q匹配成功,rs的gؓQ{ }Q如果表辑ּ?a\n\rbc/Q则不会被匹配,因此在一般的~辑器中一?#8221;Enter”键代表着“回R换行”Q而非“换行回R”Q至在textarea域中是这L?/p>
四,应用案例
1Q正则表辑ּ使用场景Q?br />
1Q登录场景,查用戯入的用户名,要求Q?br />
字符长度??8之间
字符必须为字母、数字或者下划线的组?br />
2Q购物场景,对于商品列表的描qͼ标签、条形码、单P{有些用户可能会提出下面需求:
希望可以对商品列表的某一列描q进行字L自定义,而且下次d仍然保持用户的修?br />
2Q下面看一下在上述两个场景中,正则表达式的使用方式和具体实现?/p>
1Q登录场景部分正则表辑ּ实现

2Q购物场景部分正则表辑ּ实现
1>需求分析:用户希望可以对商品列表的某一列描q进行字L自定义,而且下次d仍然保持用户的修?/p>

2>E序设计

cdQ?br />

3>代码实现
PageSettingc?br />
//验证email格式是否合法
function checkEmail(email)
{
var reEmail=/^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,5}/;
if (!(email.match(reEmail)&&email!=""))
{
return false;
}
else {
return true;
}
}