正则表达式
regular expression:RegExp
用来处理字符串的规则
- 只能处理字符串
- 它是一个规则:可以验证字符串是否符合某个规则(test),也可以把字符串中符合规则的内容捕获到(exec / match...)
- 学习正则就是用来制定某种规则
正则的作用
- 正则定义了一个字符串的模型。
- 正则的第一个作用是“验证某字符串是否和这个模型相匹配”。
- 正则的第二个作用是“把匹配到的内容找出来”。
编写正则表达式
创建方式有两种:
- 字面量创建方式(两个斜杠之间包起来的,都是用来描述规则的元字符;以及模式修正符)
var reg1 = /\d+/;
- 构造函数模式创建 (两个参数:元字符字符串,修饰符字符串)
var reg2 = new RegExp("\\d+");
正则表达式由两部分组成:
- 元字符
- 修饰符
元字符
/*常用的元字符*/
//1.量词元字符:设置出现的次数
* 零到多次
+ 一到多次
? 零次或者一次
{n} 出现n次
{n,} 出现n到多次
{n,m} 出现n到m次
//2.特殊元字符:单个或者组合在一起代表特殊的含义
\ 转义字符(普通->特殊->普通)
. 除\n(换行符)以外的任意字符
^ 以哪一个元字符作为开始
$ 以哪一个元字符作为结束
\n 换行符
\d 0~9之间的一个数字
\D 非0~9之间的一个数字 (大写和小写的意思是相反的)
\w 数字、字母、下划线中的任意一个字符
\s 一个空白字符(包含空格、制表符、换页符等)
\t 一个制表符(一个TAB键:四个空格)
\b 匹配一个单词的边界
x|y x或者y中的一个字符
[xyz] x或者y或者z中的一个字符
[^xy] 除了x/y以外的任意字符
[a-z] 指定a-z这个范围中的任意字符 [0-9a-zA-Z_]===\w
[^a-z] 上一个的取反“非”
() 正则中的分组符号
(?:) 只匹配不捕获
(?=) 正向预查
(?!) 负向预查
//3.普通元字符:代表本身含义的
/bingdu/ 此正则匹配的就是 "bingdu"
修饰符
/*正则表达式常用的修饰符:*/
i ignoreCase 忽略单词大小写匹配
m multiline 可以进行多行匹配
g global 全局匹配
/A/.test('abc') false
/A/i.test('abc') true
元字符详细解析
^和 $
^ 用在正则表达式开始/之后,表示以...开始
var reg = /^\d/; // 表示以\d开始 (以数字开始)
console.log(reg.test("abc")); false
console.log(reg.test("123abc")); true
console.log(reg.test("abc123")); false
var reg = /\d$/;
console.log(reg.test("abc")); false
console.log(reg.test("123abc")); false
console.log(reg.test("abc123")); true
// ^/$两个都不加表示字符串中包含符合规则的内容即可
var reg1 = /\d+/;
// ^/$两个都加表示字符串只能是和规则一致的内容
var reg2 = /^\d+$/;
\转义符
//.不是小数点,是除\n外的任意字符
var reg = /^2.3$/; // 以2开始, 以3结束,中间有一位字符(除\n都可以)
console.log(reg.test("2.3")); // true
console.log(reg.test("2#3")); // true
console.log(reg.test("23")); // false 中间没有任意字符
console.log(reg.test("2tt3")); // false 中间有两个(只能有一个)
//基于转义字符,让其只能代表小数点
var reg = /^2\.3$/;
console.log(reg.test("2.3")); // true
console.log(reg.test("2#3")); // false
// var reg = /^[0-9]\.[0-9]$/;
// console.log(reg.test("2.3")); // true
// console.log(reg.test("9.7")); // true
// console.log(reg.test("2#3")); // false
// console.log(reg.test("23")); // false
// console.log(reg.test("2tfdfdt3")); // false
// console.log(reg.test("94.76")); // false
// var reg = /^[0-9]+\.[0-9]$/;
// console.log(reg.test("2.3")); // true
// console.log(reg.test("9.7")); // true
// console.log(reg.test("2#3")); // false
// console.log(reg.test("23")); // false
// console.log(reg.test("2tfdfdt3")); // false
// console.log(reg.test("9444.7")); // true
var reg = /^[0-9]+\.[0-9]{2}$/;
console.log(reg.test("2.3")); // true
console.log(reg.test("9.7")); // true
console.log(reg.test("2#3")); // false
console.log(reg.test("23")); // false
console.log(reg.test("2tfdfdt3")); // false
console.log(reg.test("9444.74")); // true
x|y
//直接x|y会存在很乱的优先级问题,一般我们写的时候都伴随着小括号进行分组,因为小括号改变处理的优先级 小括号:分组
var reg = /^(13|15)$/;
console.log(reg.test("13")); true
console.log(reg.test("15")); true
console.log(reg.test("135")); false
console.log(reg.test("153")); false
[]
//1.中括号中出现的字符一般都代表本身的含义
var reg = /^[@+]$/;
console.log(reg.test("@")); true
console.log(reg.test("+")); true
console.log(reg.test("@+")); false
var reg = /^[\d]$/; //\d在中括号中还是0-9
console.log(reg.test("d")); // false
console.log(reg.test("9")); // true
//2.中括号中不存在多位数
reg = /^[18]$/;
console.log(reg.test("1")); true
console.log(reg.test("8")); true
console.log(reg.test("18")); false
reg = /^[10-29]$/; //1或者0-2或者9
console.log(reg.test("1")); true
console.log(reg.test("9")); true
console.log(reg.test("0")); true
console.log(reg.test("2")); true
console.log(reg.test("10")); false
{n}, {n,}, {m,n} 注意 m和n之间不能有空格
// {n}表示出现过n次
var reg = /c{1}/;
console.log(res.test('china'));
console.log(res.test('chinac'));
// {m,n}匹配最少m个,最多n个 c{3,4}的意思是,连续的3个c或者4个c
// c{1,}表示1个以上的c,相当于元字符+
// *表示0次或者多次,等同于{0,},即c* 和c{0,} 是一个意思。
// +表示一次或者多次,等同于{1,},即c+ 和c{1,} 是一个意思。
// ?表示0次或者1次,等同于{0,1},即c? 和c{0,1} 是一个意思。
正则表达式的方法:
- test() // test() 方法检索字符串中的指定值。返回值是 true 或 false。
- exec() // exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。
常用的正则表达式
-
验证是否为有效数字
/* 规则分析: 1. 可能出现+-(正负) [+-]? 2. 一位0-9可以的,或者多位,但多位的情况下,首位不能是0 \d|[1-9]\d+ 3. 可能会小数点 (\.\d+)? */ var reg = /^[+-]?(\d|[1-9]\d+)(\.\d+)?$/;
-
验证密码
//数字、字母、下划线 \w //6~16位 {6,16} var reg = /^\w{6,16}$/
-
验证真实中文姓名
1. 中文的unicode编码区间: \u4e00 - \u9fa5 2. 长度 至少两个, 至多30个 {2,10} 3. 可能译名 · var reg = /^[\u4e00-\u9fa5]{2,10}(·[\u4e00-\u9fa5]{2,10}){0,2}$/;
-
验证邮箱
//1.开头是数字字母下划线(1到多位) \w+ //2.可以是 -数字字母下划线 (零到多次) [\w-]* //3. @后面紧跟着:数字、字母 (1-多位) @后不能直接跟下划线和中划线 @[a-zA-Z0-9]+ //4. 再后面跟字母、数字、下划线、中划线 [\w-]* //5. 域名 .com也可以多域名.com.cn (\.[a-zA-Z0-9]+)+ var reg = /^\w+[\w-]*@[a-zA-Z0-9]+[\w-]*(\.[a-zA-Z0-9]+)+$/;
-
验证身份证号码
// 1.基本上是数字 一共18位 // 2. 最后一位可能是X var reg = /^\d{17}(\d|X)$/;