正则表达式
1)简介:是一个描述字符模式的对象
2)创建:
>构造函数
var pattern =new RegExp("正则表达式","修饰符")
>正则表达式字面量
var pattern = /正则表达式/修饰符;
ps:
1-修饰符:
g global 全局
i ignore case 不区分大小写
m multiline 多行
2-case
1)以数字开始的换行字符串 (修饰符有无m(多行)的区别:)
var str = 'hello\n1wq\n2asd';
var pattern = /^\d/img;
var res = str.match(pattern);
console.log(str);
console.log(res); //[ '1', '2' ]
修饰符有无m(多行)的区别:
var str1 = 'hello\n1wq\n2asd';
var pattern1 = /^\d/ig;
var res1 = str1.match(pattern1);
console.log(str1);
console.log(res1); //null
2)关于g修饰符对于lastIndex属性的影响
var str3 = 'hello js hello world';
var pattern = /hello/img;
console.log(pattern.exec(str3));//因为有g修饰符下次检测的时候从五号位置开始
console.log(pattern.lastIndex);
console.log(pattern.exec(str3));//下次检测的时候从五号位置开始
console.log(pattern.lastIndex);
// 输出:
// [ 'hello', index: 0, input: 'hello js hello world', groups: undefined ]
// 5
// [ 'hello', index: 9, input: 'hello js hello world', groups: undefined ]
// 14
结论:如果正则表达式中加了g修饰符,表示每次检测完之后,都会维护lastIndex属性
如果不加g,则不会维护lastIndex属性,每次检查都从字符串的最左侧开始.
2)字符类
. (点号,小数点) 匹配任意单个字符,但是行结束符除外
\d 匹配任意阿拉伯数字。等价于[0-9]
\D 匹配任意一个不是阿拉伯数字的字符。等价于[^0-9]。
\w 匹配任意来自基本拉丁字母表中的字母数字字符,还包括下划线。等价于 [A-Za-z0-9_]。
\W 匹配任意不是基本拉丁字母表中单词(字母数字下划线)字符的字符。等价于 [^A-Za-z0-9_]。
\s 匹配一个空白符,包括空格、制表符、换页符、换行符和其他 Unicode 空格。
\S 匹配一个非空白符。
\t 匹配一个水平制表符(tab)
\r 匹配一个回车符(carriage return)
\n 匹配一个换行符(linefeed)
\v 匹配一个垂直制表符(vertical tab)
\f 匹配一个换页符(form-feed)
[xyz] 一个字符集合,也叫字符组。匹配集合中的任意一个字符。你可以使用连字符‘-’指定一个范围。[0-9] [a-z]
[^xyz] 一个反义或补充字符集,也叫反义字符组。也就是说,它匹配任意不在括号内的字符。你也可以通过使用连字符 '-' 指定一个范围内的字符。
^ 匹配输入开始。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符后的开始处。
$ 匹配输入结尾。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符的前的结尾处。
\b 匹配一个零宽单词边界(zero-width word boundary),如一个字母与一个空格之间。
\B 匹配一个零宽非单词边界(zero-width non-word boundary),如两个字母之间或两个空格之间。
(x) 匹配 x 并且捕获匹配项。 这被称为捕获括号(capturing parentheses)。
\n n 是一个正整数。一个反向引用(back reference),指向正则表达式中第 n 个括号(从左开始数)中匹配的子字符串。
数量词
x* 匹配前面的模式 x 0 或多次。
x+ 匹配前面的模式 x 1 或多次。等价于 {1,}。
x? 匹配前面的模式 x 0 或 1 次。
x{n} n 是一个正整数。前面的模式 x 连续出现 n 次时匹配
x{n,} n 是一个正整数。前面的模式 x 连续出现至少 n 次时匹配。
x{n,m} n 和 m 为正整数。前面的模式 x 连续出现至少 n 次,至多 m 次时匹配。
x*? 像上面的 * 一样匹配前面的模式 x,然而匹配是最小可能匹配。
x+? 像上面的 + 一样匹配前面的模式 x,然而匹配是最小可能匹配。
x|y 匹配 x 或 y
例如:/\w+:\/\/\w+(\.)\w+\1\w+/
http://www.baidu.com
3)属性
RegExp.prototype.global 布尔值,表明这个正则表达式是否带有修饰符g
RegExp.prototype.ignoreCase 布尔值,表明这个正则表达式是否带有修饰符i
RegExp.prototype.multiline 布尔值,表明这个正则表达式是否带有修饰符m
RegExp.prototype.lastIndex 如果匹配模式带有g,这个属性存储在整个字符串中下一次检索的开始位置,这个属性会被exec(), test()方法调用到
RegExp.prototype.source 正则表达式的字符串形式
RegExp.prototype.flags 修饰符的字符串形式
>
var pattern3 = /wo/img;
console.log(pattern3.source);//wo
console.log(pattern3.global);//true
4)方法
RegExp.prototype.test(str)
>检测字符串str中是否存在满足条件的字符
>返回值:true\false
>参数:需要检测的字符串
RegExp.prototype.exec(str)
>检测字符串中的正则表达式的匹配
>参数:字符串
>返回值: 满足条件的字符组成的数组\null
>
var str2 = "hello regexp";
var pattern4 = /he/img;
console.log(pattern4.exec(str2));//[ 'he', index: 0, input: 'hello regexp', groups: undefined ]
>关于g修饰符对于lastIndex属性的影响
: var str3 = 'hello js hello world';
var pattern = /hello/img;
console.log(pattern.exec(str3));//因为有g修饰符下次检测的时候从五号位置开始
console.log(pattern.lastIndex);
console.log(pattern.exec(str3));//下次检测的时候从五号位置开始
console.log(pattern.lastIndex);
// 输出:
// [ 'hello', index: 0, input: 'hello js hello world', groups: undefined ]
// 5
// [ 'hello', index: 9, input: 'hello js hello world', groups: undefined ]
// 14
结论:如果正则表达式中加了g修饰符,表示每次检测完之后,都会维护lastIndex属性
如果不加g,则不会维护lastIndex属性,每次检查都从字符串的最左侧开始.
题目: 找出字符串中所有满足条件的字符串,并以数组形式返回
>
var str = 'hello js hello world';
var pattern = /hello/img;
var res;
var arr=[];
while(res = pattern.exec(str)){
arr.push(res);
}
console.log(arr);//[ 'hello', 'hello' ](有g)
> var str = 'hello js hello world';
var pattern = /hello/img;
console.log(str.match(pattern));//[ 'hello', 'hello' ]
RegExp.prototype.toString()
5)正则表达式小case
1)以数字开始的换行字符串 (修饰符有无m(多行)的区别:)
var str = 'hello\n1wq\n2asd';
var pattern = /^\d/img;
var res = str.match(pattern);
console.log(str);
console.log(res); //[ '1', '2' ]
修饰符有无m(多行)的区别:
var str1 = 'hello\n1wq\n2asd';
var pattern1 = /^\d/ig;
var res1 = str1.match(pattern1);
console.log(str1);
console.log(res1); //null
2)匹配三个连续的数字
var str = ‘123.123q’;
var pattern = /\d\d\d/ig;
console.log(str.match(pattern));//[ ‘123’, ‘123’ ]
3)匹配日期
var str = ‘2021/23/2’;
var pattern = /\d\d\d\d/\d\d/\d/ig;
//两者等价
// var pattern = /\d{4}/\d{2}/\d/ig;
console.log(str.match(pattern));//[ ‘2021/23/2’ ]
4)匹配手机号
var num = 12345678352259;
var pattern = /^1\d{10}/img;
console.log(pattern.test(num));//是否满足11位数字 true
var num = 1234567835;
var pattern = /^1\d{10}$/img;//加上$严格控制位数
console.log(pattern.test(num));//是否满足11位数字 false
5)验证手机号---[可以用于表单验证]
11位,以数字1开头,第二位3,4,5,6,7,8,9
var num = 1235637462;
var pattern=/^1[3,4,5,6,7,8,9]\d{9}$/img;
//或者var pattern = /^1[3~9]\d{9}$/img;
console.log(pattern.test(num));
6)日期对象
Data()
var str = new Date();
console.log(str);//此时输出的是标准时间(中国比标准时间快8小时)//对时间进行转换---moment.js第三方库函
//如何导入moment.js库
//在html中导入该库(在bootCDN)
在http://momentjs.cn/docs/#/parsing/
>解析
moment();
>显示
moment(str).format('YYYY MM DD hh:mm:ss');//参数