量词+, * 和?
一些被广泛使用的缩写量词"+","*"和"?"。
基本上,它们都是数量词的简写:
"+"
表示“大于等于一个”,等同于"{1,}"。
例如:"\d+"匹配一个任意长度的数字: 1 showMatch( "number 12345", /\d+/ ) // 12345
"?"
表示“零个或一个”,等同于"{0,1}"。它让一个字符变成可选的。
例如:"ou?nd"可以匹配"second"中的"ond",以及"secound"中的"ound"。
1 showMatch( "second", /secou?nd/ ) // "second" 2 showMatch( "secound", /secou?nd/ ) // "secound", both variants match
"*"
表示“零个或多个”,等同于"{0,}"。一个字符可能会重复多次,亦或压根就不存在。
下例匹配一个后面跟了零个或多个"0"的数字。
1 showMatch( "100 10 1", /\d0*/g ) // 100, 10, 1
和"+"(一个或多个)对比:
1 showMatch( "100 10 1", /\d0+/g ) // 100, 10
量词是正则式的基石,下面有更多示例。
浮点数(带“.”):"\d+\.\d+"
1 showMatch( "Any number of digits: 123.45", /\d+\.\d+/ ) // 123.45
没有属性的HTML开始标签:"/<[a-z]+>/i"
1 showMatch( "<BODY> ... </BODY>", /<[a-z]+>/gi ) // <BODY>
上面的正则式匹配符号"<",后面跟着一个或多个字母,并以">"符号结尾。这就是匹配一个开始标签的一种写法。
开始标签(更好):"/<[a-z][a-z0-9]>/i"
一个HTML标签可能在除了首位的任意位置出现数字。所以第一个字符是"[a-z]",后面跟着零个或多个"[a-z0-9]"。
1 showMatch( " 2 ... ", /<[a-z][a-z0-9]*>/gi ) // <H1>
这儿我们遇到一个会经常出现的尴尬情况。正则式越精确就越复杂。比如在HTML标签示例中,"<\w+>"也是个不错的选择。
当然"<\w+>"会匹配到非法标签如:"<_>",但是却比"<[a-z][a-z0-9]>"简单的多,而且在实际数据匹配中,也运行的非常好。
开始或结束标签:"/<\/?[a-z][a-z0-9]>/i"
为了同时能匹配开始和结束标签,一个可选择的斜杠"/?"被加在标签名前面。斜杠需要为JS解释器转义。
1 var re = /<\/?[a-z][a-z0-9]*>/gi 2 3 showMatch( "<BODY> ... </BODY>", re ) // <BODY>, </BODY>
查找一个正或者负的小数。
1 var re = /* your regexp */ 2 3 var str = "1.5 0 123 -7 -0.4" 4 5 alert(str.match(re)) // ‘1.5‘, ‘-0.4‘
一个整数"\d+"。再加一个小数在后面"\.\d+"变成"\d+\.\d+"。
现在让我们在前面再添加一个可选的负号"-?"变成"-?\d+\.\d+"。
最后,测试一下:
1 var re = /-?\d+\.\d+/g 2 3 var str = "1.5 0 123 -7 -0.4" 4 5 alert(str.match(re)) // ‘1.5‘, ‘-0.4‘
写一个正则式匹配数字。需要包含正整数和正小数:
1 var re = /* your regexp */ 2 3 var str = "1.5 0 123" 4 5 alert(str.match(re)) // ‘1.5‘, ‘0‘, ‘123‘
整数部分"\d+"。
小数部分"\.\d+",再加一个"?"让它变得可选。
最后结果为:"\d+(\.\d+)?"。
1 var re = /\d+(\.\d+)?/g 2 3 var str = "1.5 0 123" 4 5 alert(str.match(re)) // ‘1.5‘, ‘0‘, ‘123‘