辅助工具
- 在线匹配 https://c.runoob.com/front-end/854/
- 百度前端助手
(一)创建正则表达式对象
1.1 字面量方式
1.2 new 关键字
1.3 字符串全局替换
<script>// 1 字面量方式创建正则表达式var reg = /web/; // 次正则的意思是:只要字符串含有web就满足条件var str = 'asdfasdfas23423lwebsadfasdfas';// 使用test方法检查字符串是否满足正则表达式的规则console.log('reg',reg.test(str)); // 满足条件就返回true,否则就返回false// 2 正则表达式参数 i-不区分大小写 g-全部 m-多行var reg2 = /web/i;var str2 = 'aaWeBaaa';console.log('reg2',reg2.test(str2));// 3 字符串替换var str3 = 'web前端22222222222web前端333333333333web前端';var newStr3 = str3.replace(/web前端/g,'java');console.log('newStr3',newStr3);// 4 使用构造函数创建正则表达式对象var reg4 = new RegExp('web','i');var str4 = '222web2222222web222';console.log('reg4',reg4.test(str4)); // true</script>
(二)常用匹配规则
2.1 元字符
- 任意字符 .
- \w 字母、数字、下划线
- \s 任意空白字符
- \d 匹配数字,等同于[0-9]
- \D 匹配非数字,等同于[^0-9]
- | 或匹配,如 /x|y/ 正则可匹配 x 或 y 两个字符
- ^ 匹配字符串的开始
- $ 匹配字符串的结束
[abc] 表示 包含里面的任意一个
<script>// 1. .匹配任意字符var reg1 = /./;var str = 'asdfasdf';reg1.test(str); // true// 2. \w匹配字母,数字,下划线var reg2 = /\w\w\w/;var str2 = 'asdf';reg2.test(str2); // true// 3. \s 任意空白字符var reg3 = /ab\sab/;var str3 = 'ab ab';reg3.test(str3); // false ab与ab之间只能有一个空格// 4. \d 匹配数字var reg4 = /\d\d/;var str = '1234';reg4.test(str); // true// 5. \D 匹配非数字var reg5 = /^\D$/;var str5 = '23423a234234';reg5.test(str5); // true// 6. | 或者var reg6 = /13|18/;var str6 = '1388888';reg6.test(str6);var str6 = '18234234'reg6.test(str6);var reg6 = /abc|xyz/;var str6 = 'asdfasdabcasdf';reg6.test(str6);// 7. ^匹配开始var reg7 = /^web/;var str7 = 'asdfasdfwebasdfasdf';var str7_2 = 'webasdfasdf';reg7.test(str7); // falsereg7.test(str7_2); // true// 8. $匹配结尾var reg8 = /^j\w\dt$/;var str8 = 'ja4t';reg8.test(str8); // true// 9. [abc] 只要包含abc任意一个字符都能匹配var reg9 = /[abc]/;var str9 = '2322alll';reg9.test(str9);// 10. [^x] 只要有一个不是x的字符都能匹配var reg10 = /[^x]/;var str10 = 'asdf';reg10.test(str10);// 11. [^abc] 只要有一个不是a,b,c的字符都能匹配var reg11 = /[^abc]/;var str11 = 'asdf';reg11.test(str11);</script>
2.2 反义字符
- [^x] 匹配除“x”之外的所有字符,其中“x”可以为任意字符
- [^xyz] 同上,匹配除“x、y、z”之外的任意字符
(三)重复匹配
3.1 ? 重复出现零次或一次
3.2 + 重复出现一次或多次
3.3 * 重复出现零次或多次
3.4 {n} 重复出现 n 次
3.5 {n,} 至少重复出现 n 次
3.6 {m,n} 重复重现 m 到 n 次,其中,m<n
<script>// 1. .匹配任意字符var reg1 = /./;var str = 'asdfasdf';reg1.test(str); // true// 2. \w匹配字母,数字,下划线var reg2 = /\w\w\w/;var str2 = 'asdf';reg2.test(str2); // true// 3. \s 任意空白字符var reg3 = /ab\sab/;var str3 = 'ab ab';reg3.test(str3); // false ab与ab之间只能有一个空格// 4. \d 匹配数字var reg4 = /\d\d/;var str = '1234';reg4.test(str); // true// 5. \D 匹配非数字var reg5 = /^\D$/;var str5 = '23423a234234';reg5.test(str5); // true// 6. | 或者var reg6 = /13|18/;var str6 = '1388888';reg6.test(str6);var str6 = '18234234'reg6.test(str6);var reg6 = /abc|xyz/;var str6 = 'asdfasdabcasdf';reg6.test(str6);// 7. ^匹配开始var reg7 = /^web/;var str7 = 'asdfasdfwebasdfasdf';var str7_2 = 'webasdfasdf';reg7.test(str7); // falsereg7.test(str7_2); // true// 8. $匹配结尾var reg8 = /^j\w\dt$/;var str8 = 'ja4t';reg8.test(str8); // true// 9. [abc] 只要包含abc任意一个字符都能匹配var reg9 = /[abc]/;var str9 = '2322alll';reg9.test(str9);// 10. [^x] 只要有一个不是x的字符都能匹配var reg10 = /[^x]/;var str10 = 'asdf';reg10.test(str10);// 11. [^abc] 只要有一个不是a,b,c的字符都能匹配var reg11 = /[^abc]/;var str11 = 'asdf';reg11.test(str11);/****** 重复 ********/// 1. ?匹配0次或1次var reg1 = /^https?:\/\//;var str1 = 'http://asdfasdf';var str1_2 = 'https://asdfasdf';reg1.test(str1); // truereg1.test(str1_2); // true// 2. +匹配一次或多次var reg2 = /a+/;var str = 'dfsdfsdfaasdafsaaaf';reg2.test(str);// 3. *匹配0次到多次var reg3 = /^https?:\/\/.*/;var str = 'http://asdfasdf';// 4.{n} 重复n次var reg4 = /^1\d{10}$/;var str4 = '13800000000';reg4.test(str4);// 5. {n,}// 6. {m,n}</script>
(四) 分组
4.1 用括号分组
4.2 分组的应用
<script>// 1.括号表示一个整体var reg = /^(0|86|17951)?1\d{10}/;var str = '8613811111111';reg.test(str);// 2. 分组var reg2 = /(a{3})(b{4})-\1\2/;var str2 = 'aaabbbb-aaabbbb';reg2.test(str2);// 3.字符串替换分组// var reg3 = /(\d{3})(\d{4})(\d{4})/;var str3 = '15013795530';str3.replace(/(\d{3})(\d{4})(\d{4})/,'$1****$3');</script>
五、贪婪匹配和惰性匹配
字符串的match方法,可以检查匹配了几次
var str = 'a3abbba4a';var res = str.match(/a\da/g);console.log(res); // ['a3a','a4a']
贪婪匹配,尽可能多的匹配(默认贪婪匹配)
var str = '<img src="http://static.huruqing.cn/fresh/banner1.jpeg" /> <img src="http://static.huruqing.cn/fresh/banner2.jpeg" /> <img src="http://static.huruqing.cn/fresh/banner3.jpeg" />';var res = str.match(/http.*jpeg/g);console.log(res);
懒惰匹配,尽可能少的匹配, 在重复的后面加?即可
<script>var str = '<img src="http://static.huruqing.cn/fresh/banner1.jpeg" /> <img src="http://static.huruqing.cn/fresh/banner2.jpeg" /> <img src="http://static.huruqing.cn/fresh/banner3.jpeg" />';var res = str.match(/http.*?jpeg/g);console.log(res);</script>
正则表达式解读
/^(0|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/
^(0|86|17951)? 括号内容0次到1次 2. (13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57]) 手机号码前三位 3. [0-9]{8}$ 后8位
/\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*/ ```
- \w+ 数字,字母,下划线一次或多次
- ([-+.]\w+)*
- 括号内的东西0次或多次
- -+.任意一个
- 数字,字母,下划线一次或多次
- 括号内的东西0次或多次
- @\w+ 同上
- ([-.]\w+)* 类似第2点
- .\w+ . 同上
([-.]\w+)* 同上 ```
/^https?:\/\/(([a-zA-Z0-9-])+(.)?)*(:\d+)?(\/((.)?(\?)?=?&?[a-zA-Z0-9-](\?)?))$/i
- ^https?:\/\/ http:// 或者https://
- (([a-zA-Z0-9_-])+(.)?)*
- ([a-zA-Z0-9_-])+ 字母,数字,下划线,- 一个或多个
- (.)? .一次或0次
- (:\d+)?
- (\/((.)?(\?)?=?&?a-zA-Z0-9_-?))$
