正则表达式是一个考验每个程序员记忆力的功能,大家都经历过忘了再记,记了再忘的痛苦,在这里试图先通过一个简单的表格方式来呈现它,然后再慢慢品味,消化它。
1.1普通字符
普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。包含所有大写和小写字母,所有数字,所有标点符号和一些其他字符。
[ABC]:匹配[...]中所有的字符,例如[aeiou]匹配字符串“googlerunoobtaobao”中所有的aeiou字符,如下:
[^ABC]:匹配除了[...]中字符以外的所有字符,例如[^aeiou]匹配字符串“googlerunoobtaobao”中除了aeiou之外的所有字母,如下:
[A-Z]:[A-Z]表示一个区间,匹配所有大写字母,[a-z]表示所有小写字母,如下:
.:匹配除换行符(\r,\n)之外的任何单个字符,等于[^\n\r],如下:
[\s\S]:匹配所有。\s是匹配所有空白字符,包含换行,\S非空白符,不包含换行,如下:
\w:匹配字母,数字,下划线。等价于[A-Za-z0-9_],如下:
非打印字符也可以是正则表达式的一部分,下表列举了非打印字符的转义序列。
所谓特殊字符,就是一些有特殊含义的字符,如runoo*b中的*,简单的说就是表示任何字符串的意思。如果要查找字符串中的*符号,则需要对*进行转义,即在起前面加一个\,例如runo\*ob匹配字符串runo*ob。
许多元字符要求在试图匹配他们的时候对他们特别对待,若要匹配这些特殊字符,必须首先使字符转义,即,使用反斜杠\放在他们前面。
限定符用来指定正则表达式的一个给定的组件必须出现多少次才能满足匹配。有*或+或或{n}或{n,}或{n,m}共6种。
正则表达式/[1-9][0-9]*/g匹配一个正整数,[1-9]是指第一位数字不能是0,[0-9]*匹配任意多个数字。
注意限定符出现在范围表达式之后。因此,它应用于整个范围表达式,在本例中,只指定从0到9的数字(包括0和9)。这里不适用+限定符,因为在第二个位置或后面不一定需要有一个数字。也不适用?字符,因为使用?会将整数限制到只有两位数。
如果想想设置0~99的两位数,可以使用
/[0-9]{1,2}/
这个表达式的缺点是,只能匹配两位数字,而且可以匹配0,00,01,10,99的章节编号仍只匹配开头两位数字,改进一下,匹配1~99的正则表达式如下:
/[1-9][0-9]/或/[1-9][0-9]{0,1}/
*和+限定符都是贪婪的,因为他们会尽可能多的匹配文字,只有在他们的后面加上一个?就可以实现非贪婪或最小匹配。
例如:要搜索html文档,以查找在h1标签内容。HTML代码如下:
标题1
贪婪:下面的表达式匹配从开始小括号(<)到关闭h1标记的大括号(>)之间所有的内容,得到的结果是
标题1
/<.*>/
非贪婪:如果只需要匹配开始和结束h1标签,下面的非贪婪表达式只匹配
也可以使用下面的表达式来匹配h1标签:
/<\w+>/
通过在*,+或限定符知否放置,表达式从“贪婪”表达式转换为“非贪婪”表达式或者最小匹配。
定位符能将正则表达式固定到行首或行尾,还可以使用定位符匹配一个单词内部,一个单词的开头或者一个单词的结尾。
定位符用来描述字符串或单词的边界,^和$分别指定字符串的开始与结束,\b描述单词的前后边界,\B表示费单词边界。正则表达式定位符有:
注意:不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或者后面不能有一个以上的位置,因此不允许有^*这样的表达式。
若要匹配一行文本开始出的文本,需要在正则表达式的开始使用^字符。不要将^这种写法与中括号表达式内的用法混淆。
若要匹配一行文本结束出的文本,需要在正则表达式的结束处使用$字符。
若要在搜索章节标题时使用定位点,下面的正则表达式匹配一个章节标题,该标题只包含两个尾随数字,并且出现在行首:
/^Chapter[1-9][0-9]{0,1}/
真正的章节标题不仅出现在行的开始处,而且它还是该行中仅有的文本。它既出现在行首又出现在同一行的结尾。下面的表达式能确保指定的匹配只匹配章节而不匹配交叉引用。通过创建只匹配一行文本的开始和结尾的正则表达式就可以做到这一点。
/^Chapter[1-9][0-9]{0,1}$/
匹配单词边界稍有不同,但向正则表达式添加了很重要的功能。单词边界是单词和空格之间的位置,非单词边界是任何其他位置。下面的表达式匹配单词Chapter的开头三个字符,因为这三个字符出现在单词边界后面:
/\bCha/
\b字符的位置非常重要。如果它位于要匹配的字符串的开始,它在单词的开始处查找匹配项。如果它位于字符串的结尾,它在单词的结尾处查找匹配。例如下面的表达式匹单词Chapter中的字符串ter,因为它出现在单词边界的前面:
/ter\b/
下面的表达式匹配Chapter中的字符串apt,但是不匹配aptitude中的字符串apt:
/\Bapt/
字符串apt出现在单词Chapter中的非单词边界处,但是出现在单词aptitude中的单词边界处。对于\B非单词边界运算符,位置并不重要,因为匹配不关心究竟是单词开头还是单词结尾。
用圆括号()将所有选择项括起来,相邻的选择项质检用|分割。
()表示捕获分组,()会把每个分组里的匹配的值保存起来,多个匹配值可以通过数字n来看(n是一个数字,表示第n个捕获组的内容)
其中:是非捕获元之一,还有两个非捕获元是=和!,这两个还有更多的含义,前者为正向鱼叉,在任何开始匹配圆括号内的正则表达式模式的位置来搜索字符串,后者为负向检查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。
2.基本语法
正则表达式(regulareexpression)描述了一种字符串匹配的模式(pattern),可以用来监测一个字符串是否包含某个子字符串,将匹配的子字符串替换,或者从某个字符串中提取出符合条件的子字符串。
例如:
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多元字符串与运算符将小的表达式结合在一起来创建更大的表达式。正则表达式的组合可以是单个字符,字符集合,字符范围,字符间的选择或者这些任意组合起来。
正则表达式是由普通字符(例如字符a到z)以及特殊字符(称为“元字符”)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与搜索的字符串进行匹配。
在JavaScript中有两种方式构造正则表达式。
使用正则表达式字面量
正则表达式的形式一般如:/love/,这种叫“直接量语法”,还有一种叫RegExp构造函数,貌似这两种是差不多的。“直接量语法”的格式形如/pattern/attributes。脚本加载后,正则表达式字面量就会被编译。当正则表达式保持不变时,使用这种方式可以获得更好的性能。
使用RegExp构造函数
RegExp构造函数的个数形如newRegExp(pattern,attributes)。脚本运行过程中,使用构造函数创建的正则表达式会被编译。如果正则表达式将会改变,或者它将会从用户输入等来运中动态地生成,就需要使用构造函数来创建正则表达式。
其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
较为常用的元字符包括:“+”,“*”,以及“”。其中,“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次,“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次,而“”元字符规定其前导对象必须在目标对象中连续出现零次或一次。下面,就让我们来看一下正则表达式元字符的具体应用。
/fo+/因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的“fool”,“fo”,或者“football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。/eg*/因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的“easy”,“ego”,或者“egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。/Wil/因为上述正则表达式中包含“?”元字符,表示可以与目标对象中的“Win”,或者“Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。
除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。例如,/jim{2,6}/上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。
在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用方式。\s:用于匹配单个空格符,包括tab键和换行符;\S:用于匹配除单个空格符之外的所有字符;\d:用于匹配从0到9的数字;\w:用于匹配字母,数字或下划线字符;\W:用于匹配所有与\w不匹配的字符;.:用于匹配除换行符之外的所有字符。(说明:我们可以把\s和\S以及\w和\W看作互为逆运算)
下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。
/\s+/上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。/\d000/如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。
除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。较为常用的定位符包括:“^”,“$”,“\b”以及“\B”。其中,“^”定位符规定匹配模式必须出现在目标字符串的开头,“$”定位符规定匹配模式必须出现在目标对象的结尾,\b定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一,而“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。同样,我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。举例来说:
/^hell/因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以“hell”,“hello”或“hellhound”开头的字符串相匹配。/ar$/因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以“car”,“bar”或“ar”结尾的字符串相匹配。/\bbom/因为上述正则表达式模式以“\b”定位符开头,所以可以与目标对象中以“bomb”,或“bom”开头的字符串相匹配。/man\b/因为上述正则表达式模式以“\b”定位符结尾,所以可以与目标对象中以“human”,“woman”或“man”结尾的字符串相匹配。
为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:/[A-Z]/上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。/[a-z]/上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。/[0-9]/上述正则表达式将会与从0到9范围内任何一个数字相匹配。/([a-z][A-Z][0-9])+/上述正则表达式将会与任何由字母和数字组成的字符串,如“aB0”等相匹配。这里需要提醒用户注意的一点就是可以在正则表达式中使用“()”把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如“abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。
如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符“|”。例如:/to|too|2/,上述正则表达式将会与目标对象中的“to”,“too”,或“2”相匹配。正则表达式中还有一个较为常用的运算符,即否定符“[^]”。与我们前文所介绍的定位符“^”不同,否定符“[^]”规定目标对象中不能存在模式中所规定的字符串。例如:/[^A-C]/,上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在“[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“\”。例如:/Th\*/上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。
再者只能多看写例子,消化消化了。
“^The”:开头一定要有”The”字符串;“ofdespair$”:结尾一定要有”ofdespair”的字符串;那么,“^abc$”:就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配;“notice”:匹配包含notice的字符串;接着,说说‘*’‘+’和‘’,他们用来表示一个字符可以出现的次数或者顺序,他们分别表示:
“zeroormore”相当于{0,}“oneormore”相当于{1,}“zeroorone.”相当于{0,1}
这里是一些例子:
“ab*”:和ab{0,}同义,匹配以a开头,后面可以接0个或者N个b组成的字符串(”a”,“ab”,“abbb”,等);“ab+”:和ab{1,}同义,同上条一样,但最少要有一个b存在(”ab”“abbb”等);“ab”:和ab{0,1}同义,可以没有或者只有一个b;“ab+$”:匹配以一个或者0个a再加上一个以上的b结尾的字符串。
要点:’*’‘+’和‘’只管它前面那个字符。你也可以在大括号里面限制字符出现的个数,比如:
“ab{2}”:要求a后面一定要跟两个b(一个也不能少)(”abb”);“ab{2,}”:要求a后面一定要有两个或者两个以上b(如”abb”“abbbb”等);“ab{3,5}”:要求a后面可以有2-5个b(”abbb”,“abbbb”,or“abbbbb”)。
现在我们把一定几个字符放到小括号里,比如:
“a(bc)*”:匹配a后面跟0个或者一个”bc”;“a(bc){1,5}”:一个到5个“bc”;
还有一个字符‘|’,相当于OR操作:
“hi|hello”:匹配含有”hi”或者“hello”的字符串;“(b|cd)ef”:匹配含有“bef”或者“cdef”的字符串;“(a|b)*c”:匹配含有这样多个(包括0个)a或b,后面跟一个c的字符串;
一个点(’.’)可以代表所有的单一字符,不包括”\n”如果,要匹配包括”\n”在内的所有单个字符,怎么办?用’[\n.]’这种模式。
“a.[0-9]”:一个a加一个字符再加一个0到9的数字;“^.{3}$”:三个任意字符结尾。
中括号括住的内容只匹配一个单一的字符
“[ab]”:匹配单个的a或者b(和“a│b”一样);“[a-d]”:匹配’a’到’d’的单个字符(和”a│b│c│d”还有“[abcd]”效果一样);
一般我们都用[a-zA-Z]来指定字符为一个大小写英文:
“^[a-zA-Z]”:匹配以大小写字母开头的字符串;“[0-9]%”:匹配含有形如x%的字符串;“,[a-zA-Z0-9]$”:匹配以逗号再加一个数字或字母结尾的字符串;
也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用’^’作为开头“%[^a-zA-Z]%”匹配含有两个百分号里面有一个非字母的字符串。要点:^用在中括号开头的时候,就表示排除括号里的字符。不要忘记在中括号里面的字符是这条规路的例外—在中括号里面,所有的特殊字符,包括(”),都将失去他们的特殊性质“[*\+{}.]”匹配含有这些字符的字符串:正如regx的手册告诉我们:”如果列表里含有’]’,最好把它作为列表里的第一个字符(可能跟在’^’后面)。如果含有’-’,最好把它放在最前面或者最后面,or或者一个范围的第二个结束点[a-d-0-9]中间的‘-’将有效。花括号中的要注意的是,n和m都不能为负整数,而且n总是小于m。这样,才能最少匹配n次且最多匹配m次。如”p{1,5}”将匹配“pvpppppp”中的前五个p。
构建一个匹配模式去检查输入的信息是否为一个表示money的数字。我们认为一个表示money的数量有四种方式:”10000.00″和“10,000.00″,或者没有小数部分,”10000″and“10,000″。现在让我们开始构建这个匹配模式:
^[1-9][0-9]*$这是所变量必须以非0的数字开头。但这也意味着单一的”0″也不能通过测试。以下是解决的方法:
^(0|[1-9][0-9]*)$“只有0和不以0开头的数字与之匹配”,我们也可以允许一个负号在数字之前:
^(0|-[1-9][0-9]*)$这就是:0或者一个以0开头且可能有一个负号在前面的数字。好了,现在让我们别那么严谨,允许以0开头。现在让我们放弃负号,因为我们在表示钱币的时候并不需要用到。我们现在指定模式用来匹配小数部分:
^[0-9]+(\.[0-9]+)$这暗示匹配的字符串必须最少以一个阿拉伯数字开头。但是注意,在上面模式中“10.”是不匹配的,只有“10″和“10.2″才可以,为什么?
^[0-9]+(\.[0-9]{2})$我们上面指定小数点后面必须有两位小数。如果你认为这样太苛刻,你可以改成:^[0-9]+(\.[0-9]{1,2})$。这将允许小数点后面有一到两个字符。现在我们加上用来增加可读性的逗号(每隔三位),我们可以这样表示:^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{1,2})$不要忘记’+’可以被’*’替代如果你想允许空白字符串被输入话,也不要忘记反斜杆’\’在php字符串中可能会出现错误(很普遍的错误):现在,我们已经可以确认字符串了,我们现在把所有逗号都去掉str_replace(”,”,“”,$money)然后在把类型看成double然后我们就可以通过他做数学计算了。
再来构建一个完整的email,在一个完整的email地址中有三个部分:
1.用户名(在‘@’左边的一切)2.’@’3.服务器名(就是剩下那部分)
用户名可以含有大小写字母阿拉伯数字,句号(’.’)减号(’-’)and下划线’_’)。服务器名字也是符合这个规则,当然下划线除外。现在,用户名的开始和结束都不能是句点,服务器也是这样。还有你不能有两个连续的句点他们之间至少存在一个字符,好现在我们来看一下怎么为用户名写一个匹配模式:
^[_a-zA-Z0-9-]+$现在还不能允许句号的存在。我们把它加上:
^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*$上面的意思就是说:以至少一个规范字符(除了.)开头,后面跟着0个或者多个以点开始的字符串。
简单化一点,我们可以用eregi()取代ereg()、eregi()对大小写不敏感,我们就不需要指定两个范围“a-z”和“A-Z”只需要指定一个就可以了:^[_a-z0-9-]+(\.[_a-z0-9-]+)*$
后面的服务器名字也是一样,但要去掉下划线:^[a-z0-9-]+(\.[a-z0-9-]+)*$
现在只需要用”@”把两部分连接:^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$
这就是完整的email认证匹配模式了,只需要调用:eregi(”^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$”,$eamil)
就可以得到是否为email了
publicstaticboolIsValidMobileNo(stringMobileNo){conststringregPattern=@"^(130|131|132|133|134|135|136|137|138|139)\d{8}$";returnRegex.IsMatch(MobileNo,regPattern);}
3.举例说明
今天遇到一个问题,这个分页做的很简单,就两个按钮,一个“上一页”,一个“下一页”,前面一个label显示“第2页共5页”,现在想在显示“第1页共5页”的时候点击“上一页”提示“已经第一页了啊”,当显示“第1页共5页”,点击下一页的时候提示“已经最后一页了啊”,如何把字符串"第2页共5页"中的数字2和5提取出来,先看代码,
$("#ctl00_MainContent_butPre,#ctl00_MainContent_butNex").on("click",function(){varpageString=$("#ctl00_MainContent_labCurPag").html(),id=$(this).attr("id"),reg=/([1-9][0-9]*)/g,pageNumbers=pageString.match(reg),tips="";if(/Pre/.test(id)&&"1"==pageNumbers[0]){tips="已经第一页了啊";}elseif(/Nex/.test(id)&&pageNumbers[0]==pageNumbers[1]){tips="已经最后一页了啊";}if(tips){vard=dialog({title:'提示',content:tips,});d.show();returnfalse;}});从w3c上看到exec是正则表达式的方法,它以字符串为参数,如下所示:返回结果是
varreg=newRegExp("abc");varstr="3abc4,5abc6";reg.exec(str);
看到这个例子的时候我觉得有戏,照葫芦画瓢这样写
varreg=newRegExp("[1-9][0-9]*","g");varstr="第2页共5页";varresult=reg.exec(str);console.log(result);
返回结果如下:
很明显不是我想要的答案,除了当前页我还想知道总共多少页,就是那个5。
match是字符串执行匹配正则表达式规则的方法,它的参数是正则表达
varreg=newRegExp("abc");varstr="3abc4,5abc6";str.match(reg);
好细微的差别啊,w3c上是不会有这么细致的介绍的,于是有了正确答案,如下:
varreg=newRegExp("[1-9][0-9]*","g");varstr="第2页共5页";varresult=str.match(reg);console.log(result);
现在已经没有研究正则表达式原理,现在只想在网上找过来看看了,下面的都是来自别人的博客。
1.正则表达式整数^[1-9]\d*$//匹配正整数^-[1-9]\d*$//匹配负整数^-[1-9]\d*$//匹配整数^[1-9]\d*|0$//匹配非负整数(正整数+0)^-[1-9]\d*|0$//匹配非正整数(负整数+0)^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$//匹配正浮点数^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$//匹配负浮点数^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0\.0+|0)$//匹配浮点数^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0\.0+|0$//匹配非负浮点数(正浮点数+0)^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0\.0+|0$//匹配非正浮点数(负浮点数+0)
3.这位博友很细心把html代码也贴出来了
4.用JSjquery取float型小数点后两位1.最笨的办法functionget(){vars=22.127456+“”;varstr=s.substring(0,s.indexOf(“.”)+3);alert(str);}2.正则表达式效果不错
参考链接:
1.长度限制
2.只能是汉字
3."只能是英文
4.只能是数字
5.只能是英文字符和数字
6.验证油箱格式
alert("oh");}
7.屏蔽关键字(这里屏蔽***和****)
8.两次输入密码是否相同
二
2.1表单项不能为空
2.2比较两个表单项的值是否相同
2.4表单项输入数值/长度限定
2.5中文/英文/数字/邮件地址合法性判断
2.6限定表单项不能输入的字符
1.检查一段字符串是否全由数字组成---------------------------------------
varret=true;for(vari=0;i
return(false);}else{return(true);}}
11.验证手机号
functionvalidatemobile(mobile){if(mobile.length==0){alert('请输入手机号码!');document.form1.mobile.focus();returnfalse;}if(mobile.length!=11){alert('请输入有效的手机号码!');document.form1.mobile.focus();returnfalse;}varmyreg=/^(((13[0-9]{1})|159|153)+\d{8})$/;if(!myreg.test(mobile)){alert('请输入有效的手机号码!');document.form1.mobile.focus();returnfalse;}}
或者
if(!/^(13[0-9]|14[0-9]|15[0-9]|18[0-9])\d{8}$/i.test(mobile))
代码如下:
functionRegExpTest(){
输出结果:0-1:I//0为index,i所在位置,1为下一个匹配所在位置input=>Iloveyou!index=>0lastIndex=>10=>I2-6:loveinput=>Iloveyou!index=>2lastIndex=>60=>love7-10:youinput=>Iloveyou!index=>7lastIndex=>100=>you说明:根据手册,exec只返回匹配结果的第一个值,比如上例如果不用while循环,将只返回'I'(尽管i空格后的love和you都符合表达式),无论re表达式用不用全局标记g。但是如果为正则表达式设置了全局标记g,exec从以lastIndex的值指示的位置开始查找。如果没有设置全局标志,exec忽略lastIndex的值,从字符串的起始位置开始搜索。利用这个特点可以反复调用exec遍历所有匹配,等价于match具有g标志。当然,如果正则表达式忘记用g,而又用循环(比如:while、for等),exec将每次都循环第一个,造成死循环。exec的输出将包含子匹配项。例子3:
输出:rain,aiinput-TheraininSpainfallsmainlyintheplainindex-4lastIndex-80-rain1-aitest方法返回一个Boolean值,它指出在被查找的字符串中是否匹配给出的正则表达式。rgexp.test(str)参数rgexp必选项。包含正则表达式模式或可用标志的正则表达式对象。str必选项。要在其上测试查找的字符串。说明test方法检查字符串是否与给出的正则表达式模式相匹配,如果是则返回true,否则就返回false。例子4:
输出结果:'cdef'不匹配正则式'ab'注意:test()继承正则表达式的lastIndex属性,表达式在匹配全局标志g的时候须注意。例子5:
输出结果:truefalsetrue当第二次调用test()的时候,lastIndex指向下一次匹配所在位置1,所以第二次匹配不成功,lastIndex重新指向0,等于第三次又重新匹配。下例显示test的lastIndex属性:例子6:
输出:true1解决方法:将test()的lastIndex属性每次重新指向0,re.lastIndex=0;search方法返回与正则表达式查找内容匹配的第一个子字符串的位置(偏移位)。stringObj.search(rgExp)参数stringObj必选项。要在其上进行查找的String对象或字符串文字。rgExp必选项。包含正则表达式模式和可用标志的正则表达式对象。说明:如果找到则返回子字符至开始处的偏移位,否则返回-1。例子6:
输出结果:Water://不与正则匹配的字符,按原字符输出32.2F//与正则相匹配的第一个字符串的原字符串Regstr0.10000000000000142C//与正则相匹配的第一个字符串的第一个子模式匹配的替换结果$1.2//与正则相匹配的第一个字符串的第二个子模式匹配项的替换结果,这里我们没有将它替换$27//与正则相匹配的第一个字符串的第一个子匹配出现的偏移量$3Water:32.2FandOil:20.30F.//原字符串newstrObjandOil://不与正则匹配的字符20.30F//与正则相匹配的第二个字符串的原字符串-5.85C//与正则相匹配的第二个字符串的第一个子模式与匹配的替换结果.30//与正则相匹配的第二个字符串的第二个子模式匹配项的替换结果,这里我们没有将它替换22//与正则相匹配的第二个字符串的第一个子匹配出现的偏移量Water:32.2FandOil:20.30F.//原字符串.//不与正则匹配的字符上面的函数参数我们全部用到了。在实际中,我们只须用将xxF替换为xxC,根据要求,我们无须写这么多参数。例子8:
输出:Water:0.10000000000000142CandOil:-5.85C.更多的应用:例子9:
输出:today:03/2011split方法将一个字符串分割为子字符串,然后将结果作为字符串数组返回。stringObj.split([separator[,limit]])参数stringObj必选项。要被分解的String对象或文字。该对象不会被split方法修改。separator可选项。字符串或正则表达式对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,返回包含整个字符串的单一元素数组。limit可选项。该值用来限制返回数组中的元素个数。说明split方法的结果是一个字符串数组,在stingObj中每个出现separator的位置都要进行分解。separator不作为任何数组元素的部分返回。例子10:
输出:Therainin,painfall,mainlyintheplain.js正则表达式之exec()方法、match()方法以及search()方法
先看代码:
varsToMatch="test,Tes,tst,tset,Test,Tesyt,sTes";varreEs=/es/gi;alert(reEs.exec(sToMatch));alert(sToMatch.match(reEs));alert(sToMatch.search(reEs));
三个弹出框内容如下:
结果分析如下:
1、RegExp的exec()方法,有一个字符串参数,返回一个数组,数组的第一个条目是第一个匹配;其他的是反向引用。所以第一个返回的结果是第一个匹配的值es(不区分大小写)。
2、String对象有一个match()方法,它返回一个包含在字符串中所有匹配的数据。这个方法调用string对象,同时传给它一个RegExp对象。所以第二个弹出语句返回的是所有符合正则表达式的数组。
3、search()的字符串方法与indexOf()有些类似,但是它使用一个RegExp对象而非仅仅一个子字符串。search()方法返回第一个匹配值的位置。所以第三处弹出的是“1”,即第二个字符就匹配了。注意的是search()方法不支持全局匹配正规表达式(带参数g)。
vartemp=document.getElementById("email").value;varmyreg=/^([a-zA-Z0-9]+[_|\_|\.])*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.])*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;if(temp.value!=""){if(!myreg.test(temp)&&temp!=""&&temp.replace(/\s/g,"")!=""){alert("email格式不正确,请重新输入!");//email.focus();returnfalse;}}
验证银行卡号
验证手机号
//匹配手机号首尾,以类似“123****8901”的形式输出'12345678901'.replace(/(\d{3})\d{4}(\d{4})/,'$1****$2');此段正则匹配字符串中的连续11位数字,替换中间4位为*号,输出常见的隐匿手机号的格式。如果要仅得到末尾4位,则可以改成如下形式:
//匹配连续11位数字,并替换其中的前7位为*号'15110280327'.replace(/\d{7}(\d{4})/,'*******$1');补充注释:正则表达式中的括号即可用于分组,同时也用于定义子模式串,在replace()方法中,参数二中可以使用$n(n为数字)来依次引用模式串中用括号定义的字串。
$("#name").html(user.name.replace(/(\d{3})\d{4}(\d{4})/,'$1****$2'));隐藏手机号中间4位