一、正则表达式入门
前言了解 - JavaScript test()
方法
- 定义和用法
test()
方法用于检测一个字符串是否匹配某个模式。如果字符串中有匹配的值返回 true ,否则返回 false。
- 语法
RegExpObject.test(string)
string
必需。要检测的字符串
1.1 字符类
[]
匹配集合中的任何字符
一、[Jj]
既可以匹配大写的J
也可以匹配小写的j
var reg = /[Jj]avaScript/;
console.log(reg.test('JavaScript')); // 输出 true
console.log(reg.test('javaScript')); // 输入 true
console.log(reg.test('TavaScript')); // 输入 false
二、 [abcde]
匹配中括号内的任意一个字母
var reg = /[abcde]/;
console.log(reg.test('abondon')); // 输入 true
console.log(reg.test('fhij')); // 输出 false
三、 [0-9]
匹配任何数字。类似于 [0123456789]。连字符-
代表区间
var reg = /[0-9]/;
console.log(reg.test(454512)); // 输出 true
console.log(reg.test('asfADA#@#')); // 输出 false
补充:
\d
匹配任意数字 (0-9). 等价于[0-9]
,简而言之,\d
===[0-9]
var reg = /\d/;
console.log(reg.test(454512)); // 输出 true
console.log(reg.test('asfADA#@#')); // 输出 false
四、 同样的[a-z]
,表示字母a-z的区间
var reg = /[a-z]/;
console.log(reg.test('asfADA#@#')); // 输出 true
console.log(reg.test(454512));// 输出 false
补充:
-
[a-zA-Z0-9_]
同样也是如此,表示a-z、A-Z、0-9的区间,最后的_
是下划线。案例见 2 -
\w
匹配字母、数字、下划线。 只匹配小ASCII码的字符(无声调字母或非罗马英文字符)。 等价于上述的[A-Za-z0-9_]
var reg = /\w/; /* /\w/ === /[a-zA-Z0-9_]/ */
console.log(reg.test('asfADA_01')); // 输出 true
console.log(reg.test(454512)); // 输出 true
console.log(reg.test('#$%#$^')); // 输出 false
五、 [^abc]
匹配不在集合中的任何字符。则匹配除了abc
外的字符
var reg = /[^abc]/;
console.log(reg.test('d')); // 输出 true
console.log(reg.test('ab')); // 输出 false
补充:
[^0-9]
匹配除了数字外的字符。
var reg = /[^0-9]/;
console.log(reg.test('d')); // 输出 true
console.log(reg.test(123)); // 输出 false
^
若不在集合[]
,则表示匹配字符串开头,或者当使用多行标志(m
)时,匹配一行的开头。 这个会匹配到位置,而不是字符。
var reg = /^dd/;
console.log(reg.test('dd123')); // 输出 true,因其以dd开头
console.log(reg.test('da123')); // 输出 false
- 既然又开头
^
,那必然有结尾。$
匹配字符串结尾,或者当使用多行标志(m
)时,匹配一行的结尾。 这个会匹配到位置,而不是字符。
var reg = /123$/;
console.log(reg.test('1dd123')); // 输出 true,因其以123结尾
console.log(reg.test('abc321')); // 输出false
var reg = /^12$/; // 若 ^ 和 $ 都加上去,则是开头要12,结尾要12 相当于等于12,没什么意义
console.log(reg.test('12')); // 输出true
console.log(reg.test('1212'));// 输出false
- 有人可能想到
[^0-9]
,因为[0-9]
等价于\d
,所以[^0-9]
会不会等价于^/d
,答案是不会,^/d
则表示以数字开头的字符串。
var reg = /^\d/;
console.log(reg.test('1dd123'));// 输出true,因其以数字开头
console.log(reg.test('abc'));// 输出false
六、\W
为 \w
的取反,\D
为 \d
的取反
这里在写一次两者区别
-
\W
匹配非字母、数字、下划线。 等价于[^A-Za-z0-9_]
-
\w
匹配字母、数字、下划线。等价于[A-Za-z0-9_]
-
\D
匹配任意非数字字符 (0-9). 等价于[^0-9]
-
\d
匹配任意数字 (0-9). 等价于
七、 .
匹配除换行符 \n
之外的任何字符,只能出现在方括号以外。 等价于 [^\n\r]
。要匹配包括 \n
在内的任何字符,请使用象 [.\n]
的模式
var reg = /ar.r./;
console.log(reg.test('ar#rd')); // 输出 true
console.log(reg.test('ar2rA')); // 输出 true
console.log(reg.test('ar2r')); // 输出 false,因其缺失一个字符
八、 \s
匹配任何空白字符。(空格, 制表符, 换行符);\S
匹配任何非空白字符。(空格, 制表符, 换行符)
var reg = /ar\sr\s/;
console.log(reg.test('ar r\t')); // 输出 true
console.log(reg.test('ar\tr\n')); // 输出 true
console.log(reg.test('ar2rr')); // 输出 false
var reg = /ar\Sr\S/;
console.log(reg.test('ar r\t')); // 输出 false
console.log(reg.test('ar\tr\n')); // 输出 false
console.log(reg.test('ar2rr')); // 输出 true
1.2 锚定 - 他匹配位置,而不是字符。
一、 ^
和 &
开头和结尾,详细见上文的补充
二、 \b
词边界。匹配一个单词边界,也就是指单词和空格间的位置
var reg = /b\s/;
console.log(reg.test('ab sb dasb')); // 输出true,因此空格后的边界都是b
console.log(reg.test('abd sbd dasbd')); // 输出 false
var reg = /\scode\s/;
console.log(reg.test(' code ')); // 输出 true,因为前后都是空格后 为code
console.log(reg.test('code')); // 输出 false
console.log(reg.test('abdb sbcodedb dasbd')); // 输出false
三、\B
则为非词边界。匹配非单词边界。
1.3 转义字符 - 这里只介绍保留字符 \
以下字符含有特殊含义, 应该以\
(反斜杠)为开头,以表示文字字符:
+*?^$\.[]{}()|/
在一个字符集中, 只有 \
, -
, 和 ]
需要被转义
var reg = /\([0-9\-]{5}\)/; // 这里 () 与 - 都是转义的
console.log(reg.test('(12345)')); // 输出 true
console.log(reg.test('(1234-)')); // 输出 true
console.log(reg.test('(1234-')); // 输出 false
补充:
-
{1, 3}
量词。匹配指定数量个前面的标记。{1,3}
会匹配1个到3个。{3}
会匹配正好3个。{3,}
会匹配3个或更多。而+
等价于{1, }
*
等价于{0, }
-
+
匹配1个或更多前面的标记
var reg = /z[1-9]+/;
console.log(reg.test('z1')); // 输出 true,+ 匹配前面的[1-9]标记,向后匹配{1, }个字符
console.log(reg.test('z2')); // 输出 true
console.log(reg.test('z')); // 输出false,后没有出现字符可匹配
*
匹配0个或更多前面的标记。
var reg = /z[1-9]*/;
console.log(reg.test('z1')); // 输出 true
console.log(reg.test('z2')); // 输出 true
console.log(reg.test('z')); // 输出 true,向后匹配0个或更多个,所以为true,不同于 +
1.4 量词 & 多选
量词指定了前面的标记需要出现的次数。默认情况下,量词是贪婪的,会尽可能多地匹配字符。
什么是贪婪模式呢?正则表达式默认是贪婪模式,/\d{3,4}/
这里既可以匹配3
个数字也可以匹配4
个数字,但优先匹配的是4
个数字
怎么使用非贪婪模式,在表达式末尾加上?
即可
一、 ?
匹配一个字符零次或一次,另一个作用是非贪婪模式
- 匹配0个或1个前面的标记,用于标为可选项。
var reg = /abcde?/;
console.log(reg.test('abcd')); // 输出 true
console.log(reg.test('abcde')); // 输出 true
console.log(reg.test('abcdf')); // 输出 true
- 令前面的标记变慵懒,让其尽可能少地匹配字符。默认情况下,量词是贪婪的会尽可能多地匹配字符。
var reg = /\d{3,4}/;
console.log(reg.test('1234')); // 输出 true
console.log(reg.test('123')); // 输出 true,优先匹配四个,不代表不匹配三个
console.log(reg.test('12dd')); // 输出 false
var reg = /\d{3,4}?/;
console.log(reg.test('123')); // 输出 true
console.log(reg.test('123d')); // 输出 true,非贪婪模式,只匹配前三个
二 、+
, *
, {1,3}
见上方补充
三、 |
多选表现起来像 逻辑与。匹配|
前面的或后面的表达式。
它可以用在分组里面,或在整个表达式中使用。会按顺序尝试匹配。
var reg = /b(a|e|i)d/;
console.log(reg.test('bad')); // 输出 true
console.log(reg.test('bed')); // 输出 true
console.log(reg.test('bod')); // 输出 false
补充:
-
/ 表达式 /g
g
为全局搜索- 保留上次匹配结果的位置,允许子序列从上次匹配的结果继续搜索。
- 如果没有全局(
g
)标识, 后面的查询会返回相同的结果。
-
/ 表达式 /i
i
为忽略大小写- 让整个表达式对大小写不敏感。 例如,
/aBc/i
会匹配到AbC
。
- 让整个表达式对大小写不敏感。 例如,
二、入门小练习
2.1 匹配手机号(11位)
/1[345789]\d{9}/
- 必须是
11
位的数字 - 第一位数字必须以
1
开头,第二位数字可以是[3,4,5,7,8,9]
中的任意一个,后面9
个数是[0-9]
中的任意一个数字。
仅为学习所做笔记,如果不足或错误之处,请指出