日期:2014-05-16 浏览次数:20423 次
1.什么是正则表达式?
正则表达式是匹配字符串的规则。验证用户输入的字符串是否符合正则的规则。
?
2.怎么创建正则表达式?
(1).var reg=/pattern/;
(2).var reg=new RegExp('pattern');
?
3.怎么样执行正则表达式?
reg.exec(str)返回匹配成功的字符串内容。
reg.test(str)返回匹配成功则true,不匹配则false.
?
4.正则表达式规则
c{n}
{1}表示一个的意思。
/c{1}/只能匹配一个c。
/c{2}/则会匹配两个连续的c。
以此类推,
/c{n}/则会匹配n个连续的c。
c{m,n}
c{3,4}的意思是,连续的3个c或者4个c。
c{n,}
c{1,}表示1个以上的c。例如:
*,+,?
*表示0次或者多次,等同于{0,},即
c* 和 c{0,} 是一个意思。
+表示一次或者多次,等同于{1,},即
c+ 和 c{1,} 是一个意思。
最后,?表示0次或者1次,等同于{0,1},即
c? 和 c{0,1} 是一个意思。
贪心与非贪心
人都是贪婪的,正则也是如此。我们在例子reg = /c{3,4}/;str='ccccTest';的例子中已经看到了,能匹配四个的时候,正则绝对不会去匹配三个。上面所介绍的所有的正则都是这样,只要在合法的情况下,它们会尽量多去匹配字符,这就叫做贪心模式。
如果我们希望正则尽量少地匹配字符,那么就可以在表示数字的符号后面加上一个?。组成如下的形式:
{n,}?, *?, +?, ??, {m,n}?
/^开头,结尾$/
^表示只匹配字符串的开头。看下面的例子:
reg = /^c/;
str='维生素c';
execReg(reg,str);结果为null,因为字符串‘维生素c’的开头并不是c,所以匹配失败。
reg = /^c/;
str='cainiao';
execReg(reg,str);这次则返回c,匹配成功,因为cainiao恰恰是以c开头的。
点’.’
‘.’会匹配字符串中除了换行符\n之外的所有字符,例如
reg = /./;
str='cainiao';
execReg(reg,str);结果显示,正则匹配到了字符c。
二选一,正则表达式中的或,“|“
b|c表示,匹配b或者c。
例如:
reg = /b|c/;
str='blueidea';
execReg(reg,str);结果是b。
括号
reg = /^(b|c).+/;
str='bbs.blueidea.com';
execReg(reg,str);这次的结果是整个串bbs.blueidea.com,机上上面的括号这后,这个正则的意思是,如果字符串的开头是b或者c,那么匹配开头的b或者c以及其后的所有的非换行字符。
如果你也实验了的话,会发现返回的结果后面多出来一个“,b“,这是()内的b|c所匹配的内容。我们在正则表达式内括号里写的内容会被认为是子正则表达式,所匹配的结果也会被记录下来供后面使用。我们暂且不去理会这个特性。
字符集合[abc]
[abc]表示a或者b或者c中的任意一个字符。
我们在字字符集合中使用如下的表示方式:[a-z],[A-Z],[0-9],分别表示小写字母,大写字母,数字。例如:
reg =? /^[a-zA-Z][a-zA-Z0-9_]+/;
str='test';
execReg(reg,str);结果是整个test,正则的意思是开头必须是英文字母,后面可以是英文字母或者数字以及下划线。
反字符集合[^abc]
^在正则表达式开始部分的时候表示开头的意思,例如/^c/表示开头是c;但是在字符集和中,它表示的是类似“非“的意思,例如[^abc]就表示不能是a,b或者c中的任何一个。例如:
reg = /[^abc]/;
str='blueidea';
execReg(reg,str);返回的结果是l,因为它是第一个非abc的字符(即第一个b没有匹配)。同样:
?
边界与非边界
\b表示的边界的意思,也就是说,只有字符串的开头和结尾才算数。例如/\bc/就表示字符串开始的c或者是结尾的c。看下面的例子:
reg = /\bc/;
str='cainiao';
execReg(reg,str);返回结果c。匹配到了左边界的c字符。
与\b对应\B表示非边界。例如:
reg = /\Bc/;
str='bcb';
execReg(reg,str);这次会成功地匹配到bcb中的c,。然而
reg = /\Bc/;
str='cainiao';
execReg(reg,str);则会返回null。因为\B告诉正则,只匹配非边界的c。
数字与非数字
\d表示数字的意思,相反,\D表示非数字。例如:
空白
\f匹配换页符,\n匹配换行符,\r匹配回车,\t匹配制表符,\v匹配垂直制表符。
\s匹配单个空格,等同于[\f\n\r\t\v]。例如:
reg = /\s.+/;
str='This is a test? String.';
execReg(reg,str);返回“is a test String.”,正则的意思是匹配第一个空格以及其后的所有非换行字符。
同样,\S表示非空格字符。
单词字符
\w表示单词字符,等同于字符集合[a-zA-Z0-9_]。例如:
reg = /\w+/;
str='blueidea';
execReg(reg,str);返回完整的blueidea字符串,因为所有字符都是单词字符。
\W表示非单词字符,等效于[^a-zA-Z0-9_]
反向引用? **********有点难度*****不过还是理解了*******************
形式如下:/(子正则表达式)\1/
依旧用例子来说明:
1.
reg = /\w/;
str='blueidea';
execReg(reg,str);返回b。
2.
reg = /(\w)(\w)/;
str='blueidea';
execReg(reg,str);返回bl,b,l
bl是整个正则匹配的内容,b是第一个括号里的子正则表达式匹配的内容,l是第二个括号匹配的内容。
3.
reg = /(\w)\1/;? ********\1表示匹配第一个括号里正则表达式匹配的内容***************
str='blueidea';
execReg(reg,str);则会返回null。这里的“\1”就叫做反向引用,它表示的是第一个括号内的字正则表达式匹配的内容。在上面的例子中,第一个括号里的(\w)匹配了b,因此“\1”就同样表示b了,在余下的字符串里自然找不到b了。
与第二个例子对比就可以发现,“\1”是等同于“第1个括号匹配的内容”,而不是“第一个括号的内容”。
reg = /(\w)\1/;
str='bbs.blueidea.com';
execReg(reg,str);这个正则则会匹配到bb。
括号(2)
前面我们曾经讨论过一次括号的问题,见下面这个例子:
reg = /^(b|c).+/;
str='bbs.blueidea.com';
execReg(reg,str);这个正则是为了实现只匹配以b或者c开头的字符串,一直匹配到换行字符,但是。上面我们已经看到了,可以使用“\1”来反向引用这个括号里的子正则表达式所匹配的内容。而且exec方法也会将这个字正则表达式的匹配结果保存到返回的结果中。
不记录子正则表达式的匹配结果
使用形如(?:pattern)的正则就可以避免保存括号内的匹配结果。例如:
reg = /^(?:b|c).+/;
str='bbs.blueidea.com';
execReg(reg,str);可以看到返回的结果不再包括那个括号内的字正则表达式多匹配的内容