正则表达式(Regular Expression)
- 正则表达式: 也叫规则表达式,按照一定的规则组成的一个表达式,简写(regex、regexp或RE)
- 作用: 主要是匹配字符串.(在大多数编程语言中都可以使用)
- 组成: 是由元字符或者是限定符组成的一个式子
元字符
- . 表示的是: 除了\n以外的任意的一个字符 "fsdas"
- [] 表示的是: 范围
- [0-9] 表示的是0到9之间的任意的一个数字
- [100-200]是错误的 得用[1][0-9][0-9]
- [a-z] 表示的是:所有小写的字母中的任意一个
- [A-Z] 表示的是:所有大小的字母中的任意一个
- [a-zA-Z] 表示的是: 所有的字母中的任意一个
- [0-9a-zA-Z] 表示的是: 所有的数字或者是字母中的一个
- [] 另一个含义: 把正则表达式中的元字符的意义干掉 [.]
- | 表示的是: 或者
- [0-9]|[a-z] 表示的要么是一个数字,要么是一个小写的字母
- () 表示的是: 分组 提升优先级
- [0-9]|([a-z])|[A-Z] 先算小括号里面的
- ([0-9])([1-5])([a-z]) 三组,从最左边开始计算
--------都是元字符,下面这些也可以叫限定符(限定前面的表达式出现的次数)
-
- 表示的是: 前面的表达式出现了0次到多次
- [a-z][0-9]* 小写中的任意一个 后面是要么没有数字的,要么是多个数字的. 例如"fadwa2323"
-
- 表示的是: 前面的表达式出现了一次到多次
- [a-z][9]+ 小写字母一个后面最少一个9,或者多个9 例如"fasd99adasd"
- ? 表示的是: 前的表达式出现了0次到1次,最少是0次,最多1次,另一个含义: 阻止贪婪模式
- [4][a-z]? "1234ij"
- {} 表示的是: 更加明确前面的表达式出现的次数
- {0,} 表示的是前面的表达式出现了0次到多次,和*一样
- {1,} 表示的是前面的表达式出现了1次到多次,和+一样
- {0,1} 表示的是前面的表达式出现了0次到1次,和?一样
- {5,10} 表示的是前面的表达式出现了5次到10次
- {4} 表示的是前面的表达式出现了4次
- {,10} 错误的写法=======================
- ^ 表示的是以xxx开始,或者是取非(取反)
- ^[0-9] 以数字开头
- ^[a-z] 以小写字母开始
- [^0-9] 取反,非数字
- [^a-z] 非小写字母
- [^0-9a-zA-Z_] 特殊符号(_不是特殊符号)
- $ 表示的是以xxx结束
- [0-9][a-z]$ 必需以小写字母结束(一个字母一个数字结束)
- ^[0-9][a-z]$ "4f"(相当于严格模式下必需是一个数字一个字母)
- ^[0-9][a-z] "3f231d" (一个字母一个数字开头) --------------------- 限定分割线
- \d 数字中的任意一个
- \D 非数字中的一个
- \s 空白符中的一个 " "
- \S 非空白符
- \w 非特殊符号 等价于[A-Za-z0-9_]
- \W 特殊符号 等价于[^A-Za-z0-9_]
- \b 单词的边界.一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者没有其他“字”字符在其前面的位置。
- /\bm/匹配“moon”中的'm'
- /oo\b/并不匹配"moon"中的'oo',因为'oo'被一个“字”字符'n'紧跟着。
- \t tab键 水平制表符
- \ 转义字符 在非特殊字符之前的反斜杠表示下一个字符是特殊的
- 反斜杠也可以将其后的特殊字符,转义为字面量.
-----------------------分割线
正则表达式练习
- 找规律 不要追求完美
- 身份证的正则表达式
- 15位或者18位 : ([1-9][0-9]{14})|([1-9][0-9]{16}[0-9xX ]) 或者 ([1-9][0-9]{14})([0-9]{2}[0-9xX])?
- 座机号码的正则表达式
- 010-19876754或者0431-87123490: [0-9]{3,4}[-][0-9]{8} 或者 \d{3,4}[-]\d{8}
- qq号码的正则表达式
- 5位到11位: \d{5,11} 或者 [1-9][0-9]{4,11}
- 手机的正则表达式
- 130-139 143 147 150-159 170 171 173 176 177 180-189 : ([1][358][0-9]{8})|([1][4][37][0-9]{8})|([1][7][01367][0-9 ]{8})
- 邮箱的正则表达式,必须要记住的 [0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+([.][a-zA-Z]+){1,2}
JS创建正则表达式对象
-
创建方式: (正则表达式的作用:匹配字符串的) 1.通过构造函数创建对象
var reg = new RegExp(/\d{5}/); RegExp();//对象创建完毕--没有正则表达式的对象 //调用方法验证字符串是否匹配 var flag = reg.test("我的电话是10086"); console.log(flag);//true 复制代码
2.通过字面量方式创建对象
var reg = /\d{1,5}/; var flag = reg.test("我的幸运:888"); console.log(flag);//true 复制代码
-
正则表达式中:
- g 表示的是全局模式匹配
- i 表示的是忽略大小写
-
正则提取
- stringObject.match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
- 正则表达式中的()作为分组来使用,获取分组匹配到的结果用Regex.$1 $2 $3....来获取
// 1. 提取工资 var str = "张三:1000,李四:5000,王五:8000。"; var array = str.match(/\d+/g); console.log(array); // 2. 提取email地址 var str = "123123@xx.com,fangfang@valuedopinions.cn 286669312@qq.com 2、emailenglish@emailenglish.englishtown.com 286669312@qq.com..."; var array = str.match(/\w+@\w+\.\w+(\.\w+)?/g); console.log(array); // 3. 分组提取 // 3. 提取日期中的年部分 2015-5-10 var dateStr = '2016-1-5'; // 正则表达式中的()作为分组来使用,获取分组匹配到的结果用Regex.$1 $2 $3....来获取 var reg = /(\d{4})-\d{1,2}-\d{1,2}/; if (reg.test(dateStr)) { console.log(RegExp.$1); } // 4. 提取邮件中的每一部分 //-----/([0-9a-zA-Z_.-]+)[@]([0-9a-zA-Z_-]+)(([.][a-zA-Z]+){1,2})/------- var reg = /(\w+)@(\w+)\.(\w+)(\.\w+)?/; var str = "123123@xx.com"; if (reg.test(str)) { console.log(RegExp.$1); console.log(RegExp.$2); console.log(RegExp.$3); } 复制代码
-
正则替换
// 1. 替换所有空白 var str = " 123AD asadf asadfasf adf "; str = str.replace(/\s/g,"xx"); console.log(str); // 2. 替换所有,|, var str = "abc,efg,123,abc,123,a"; str = str.replace(/,|,/g, "."); console.log(str); //3. 替换空格 var str = " 哦买噶的 ,太幸福了 "; str = str.replace(/\s+/g, ""); console.log("===" + str + "==="); //所有的h都替换成S var str="HhpphH";//SSppSS str=str.replace(/[h]/gi,"S"); console.log(str); 复制代码
-
正则表达式的方法
- 正则表达式对象.exec(字符串); 需要遍历一个个提取出来(与字符串对象.match方法()一样)
// var str = "中国移动:10086,中国联通:10010,中国电信:10000"; // var reg=/\d{5}/g; // //通过正则表达式匹配这个字符串 // var array=reg.exec(str); // console.log(array); // console.log(reg.exec(str)); // console.log(reg.exec(str)); // console.log(reg.exec(str));//null var str = "中国移动:10086,中国联通:10010,中国电信:10000"; var reg=/\d{5}/g; //通过正则表达式匹配这个字符串 var array=reg.exec(str); while (array!=null){ //输出匹配的内容 console.log(array[0]); array=reg.exec(str); } 复制代码