正则
认识正则
作用是什么,怎么用,相信很多人都有这样的疑问,所以学习正则之前先要做的就是认识他:
正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。搜索模式可用于文本搜索和文本替换。
正则表达式是由一个字符序列形成的搜索模式。
当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
正则表达式可以是一个简单的字符,或一个更复杂的模式。
正则表达式可用于所有文本搜索和文本替换的操作。
用途可以用于表单验证,替换字符,批量匹配结果等等。
语法是/匹配规则/修饰符号。
举个小例子:
var reg = new RegExp('时间');
console.dir(reg);
var str = '小时,分钟,秒钟';
var reg1 = /['钟']/g;
var res = str.match(reg1);
console.log(res);
var res1 = str.replace(/['钟']/g,'Clock');
console.log(res1);
大可以试试输出,看看结果发生了什么变化。
修饰符
举个例子
var str = '去年,今年,明年';
var reg = /[年]/;
var reg1 = /[年]/g;
console.log(str.replace(reg,'来'));
console.log(str.replace(reg1,'来'));
console的输出结果如下:
去来,今年,明年
去来,今来,明来
很明显,前者只是匹配到一个满足规则的就替换了然后不再继续匹配了,所以仅仅将第一个去年的年换成了来,二后者则将所以年替换了。原因就是g是全局匹配1,在整个字符串中匹配。此外i是忽略大小写的匹配。
正则字符串
正则字符分为原义文本字符和特殊字符(元字符)。
原义文本字符就是原本意义的文本字符
举个例子:
var reg = /[a]/;
var reg1 = /[0123456789]/g;
var reg2 = /[0123456789]{3}/g;
var reg3 = /[0123456789]{1,5}/g;
console.log('123456abc1abc'.match(reg));
console.log('123456abc1abc'.match(reg1));
console.log('123456abc1abc'.match(reg2));
console.log('123456abc1abc'.match(reg3));
输出结果如下:
/[a]/:匹配到满足单个a字符输出。
/[0123456789]/g :匹配 0-9 字符串长度为1 ,可以得到多个结果。
/[0123456789]{3}/g : 匹配0-9 多个结果 每个字符长度都是3。
/[0123456789]{1,5}/g: 最长连续5个数字并且匹配到,最少1个,优先长度从高到低。
或
当遇到如下情况又该怎么分析:
var reg = /[0123456789]
[abcdefghijklmnopqrestuvwxyz]/g;
var reg1 = /[0-9][a-z]/g
var str = 'a1fjwqeirx6s6s5qw8wxs7s8w8ss6';
console.log(str.match(reg))
其中reg1 === reg。
该情况匹配2个字符;每个字符长度为1, 第一个字符0-9数字 第二个字符 a-z字符。
字符类
待匹配字符
正则字符
结果字符
一般一个正则字符匹配一个待匹配字符 ;
字符类 是匹配一类字符或者多类字符;
[] 字符类是【泛指】的;不是某个特定的。
var reg1 = /人/ ;// 人 一个正则字符
var reg = /[0-9]/g // [0-9] 一个字符类
var str = 'hdfuwe43423jfdjri3423jrreu';
// 等待匹配字符
var reg2 = /(好人坏人)|(平凡的人)/g
var str = '好人坏人平凡的人'
console.log(str.match(reg2))
字符类取反
取反符号就是^,举个例子如下
var reg = /[^0-9]/g // 除了0-9 其他都匹配
var str = 'dfjewir324324jfaioe===___===dfasf'
console.log(str.match(reg))
var reg2 = /[^a-zA-Z]/g
var reg3 = /[^0-9a-zA-Z_]/g;
var str2 = '我是一个好人,也是一个平凡的人1234abcd_';
console.log(str2.match(reg3));
第一个输出的是除了0-9数字全部都匹配输出;
第二个输出的是除数字字母下划线全部匹配输出。
元字符
var reg = /[0-9]/g
var reg = /\d/g // 匹配0-9字符
var reg = /[0-9a-zA-Z_]/g // 数字字母下划线
var reg = /[\w]/g // 匹配数字字母下划线
var reg1 = /^\d[a-zA-Z]$/g // 仅能匹配 字符长度为2开始是数字结尾是字母的
var str = '3d'
var str2 = '2djfqwoeruj3243fsrewor4234jfwqei4o3g'
console.log(str.match(reg1))
console.log(str2.match(reg1))
// 撇配 必须以为1开头;结尾无所谓 长度不限
var reg3 = /^[1][^\s]{1,}/g
var str3 = '1rowqeiur93333我'
var str4 = 'd1232dew'
console.log(str3.match(reg3));
console.log(str4.match(reg3));
// 手机号码 仅开头为1 结尾是长度为1的字符 结果为11位数的数字
var reg5 =/^1\d{10}$/g // 开头 1 结尾数字;2个字符;第一个字符长度1 长第二个字符长度10;
var iphone= '133258963456895525'
console.log(iphone.match(reg5))
console.log('112345'.match(reg5)) // 因为第二个字符长度不满组
// 边界类
var str8 = '小刚是一个好人,也是一个诚实的人';
var reg7 = /\B是\B/g;
console.log(str8.match(reg7));
var str9 = 'this is xiaogang he is a honest people';
var reg8 = /\bis\b/g; // 单词界限;匹配 is
console.log(str9.match(reg8))
量词
量词 设置 匹配字符的长度
{m,n} 匹配字符长度 最小m 最大n
{n,} 匹配字符长度 大于等于n
{n} 匹配字符长度为n
.任意字符 . 点
var reg = /^.{3}$/ // 验证长度为3任意字符
var str = 'sss'
console.log(str.match(reg))
只能为数组 不限制长度
var reg = /^[0-9]{1,}$/;
var str = "32432hfriweque4234324";
var str1 = "123123123";
console.log(str.match(reg));
// 验证某一个字符是否符合正则
// regxp.test(str) 验证某一个字符是否符合 正则表达式;返回 true false0
console.log(reg.test(str1));
//exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。
console.log(reg.exec(str1));
// 匹配 首部或者尾部为宫格
var reg1 = /^\s{1,}|\s{1,}$/g
var str3 = ' ddddddd dddddd ';
console.log(str3)
console.log(str3.replace(reg1,'-'));
// 需求:去除一个字符串中素有空格
// 匹配所有空格
var reg4 = /\s{1,}/g
console.log(str3.replace(reg4,''))
贪婪模式和非贪婪模式
// + === {1,}
// * === {0,}
// ? 非贪婪模式
var str = "djdjeiehwked383275kjd73895ne8723995b3481239b3f74e3hdjsd7r2384";
var reg = /\d{3,5}?/;
var reg1 = /\d{3,5}/;
onsole.log(str.match(reg));
console.log(str.match(reg1));
var reg2 = /\d+/g; // + 贪婪
var reg3 = /\d+?/g; // 非贪婪
console.log(str.match(reg2));
console.log(str.match(reg3));
var reg4 = /\d{0,}/g;
var reg5 = /\d*/g;
console.log(str.match(reg4));
console.log(str.match(reg5));