1. 匹配次数
1.1 匹配一个或多个字符
+匹配一个或多个字符,例如:
- a+匹配一个或者多个a
- [a-z]+匹配一个或者多个小写字母
- [0-9]+匹配一个或者多个数字
// 邮件地址检测
/[\w\.]+@\w+\.\w+/.test("asd.qwe@qq.com");//true
注意:
- 字符集合中的元字符加不加\都被解释为普通字符,但是建议加上
- [0-9+]匹配一个数字或者加号。
1.2 匹配零个或者多个字符
*匹配零个或者多个字符。
/[\w\.]*@\w+\.\w+/.test("@qq.com");//true
1.3 匹配零个或者一个字符
?匹配零个或者一个字符。
// 匹配http(s)请求地址
/https?:\/\/[\w.]+/.test("http://baidu.com"); // true
/https?:\/\/[\w.]+/.test("https://baidu.com"); // true
1.4 匹配的重复次数
大括号({})用来设定重复的次数。
- 匹配精确的值:
{3},匹配到3次。 - 匹配范围区间:
{1,3},至少匹配到1次,最多3次。 - 至少匹配次数:
{3,},至少匹配到3次。 - 至多匹配次数:
{,3}最多匹配了3次。
2. 过度匹配
在不知道匹配次数的上限的情况下,容易出现过度匹配的问题:
// 想匹配b标签中的内容
"head <B>this is in a B tag</B> mid <B>this is in another B tag</B> end."
.match(/<[Bb]>.*<\/[Bb]>/g);
// 匹配结果是<B>this is in a B tag</B> mid <B>this is in another B tag</B>
在上面例子中,第一个<B>和最后一个</B>中间的内容被/.*/全部匹配出来了。这就是“贪婪型”的元字符。
要想分别匹配两个B标签中中间的内容,需要使用“懒惰型”版本:*?
"head <B>this is in a B tag</B> mid <B>this is in another B tag</B> end."
.match(/<[Bb]>.*?<\/[Bb]>/g);
// 匹配结果是["<B>this is in a B tag</B>", "<B>this is in another B tag</B>"]
贪婪型元字符 | 懒惰型元字符 |
---|---|
* | *? |
+ | +? |
{n,} | {n,}? |
下一篇:位置匹配