快速解决正则(续)---属性、方法、综合应用
属性
常见
global:“ g” 全局匹配
ignoreCase:i 不区分大小写匹配
multiline:m 多行匹配
会用到
lastIndex:指定开始下一个匹配的索引。(表示下一次匹配开始的位置。)
source:返回String包含regexp对象的源文本的a ,并且它不包含两侧的两个正斜杠和任何标志。 在构建动态的正则表达式时,可以通过查看该属性,来确认构建出的正则到底是什么
unicode
sticky: s 是否是粘性的
方法
test:返回布尔值,判断字符串是否满足正则匹配的子串 执行搜索正则表达式和指定字符串之间的匹配。
exec:返回结果与match一致。 比match更强大
exec 方法比match更好,它能接着上一次匹配后继续匹配
与字符串相关
split
返回数组,正则匹配的子串,对字符串就行切分
第一,,表示结果数组的最大长度
第二个参数 (可选),正则使用分组时,结果数组中是包含分隔符的
match:返回匹配结果的数组,包含匹配信息 match 返回结果的格式,与正则对象的有修饰符 g 有关。
没有 g,返回的是标准匹配格式
有 g,返回的是所有匹配的内容。
search:返回正则匹配的第一个子串在字符串的下标位置。search 和 match,会把字符串转换为正则的
replace:对字符串就行替换
综合应用
具体操作:验证、切分、提取、替换(找-换)
16进制颜色值、时间、日期、ID、文件路径
数字分隔、验证密码
身份证、IPV4 提取公共部分
缩写范围 与正则方法使用
1 //匹配16进制的颜色值 2 //分析:会出现3/6个字符,且颜色在[0-9a-fA-F],避免惰性问题6开头 3 var regex = /#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g; 4 var string = "#ffbbad #Fc01DF #FFF #ffE"; 5 console.log( string.match(regex) ); 6 // => ["#ffbbad", "#Fc01DF", "#FFF", "#ffE"]
//匹配时间 //分析时间:第一位:0/1/2 第二位:0-9 第三位 0-5 第四位0-9 //当第一位为“2”是第二位只能是0-3, // /^([1][0-9]|[2][0-3]):[0-5][0-9]$/ var regex = /^([01][0-9]|[2][0-3]):[0-5][0-9]$/; console.log( regex.test("23:59") ); // => true console.log( regex.test("02:07") ); // => true
1 /* 分析日期:年,4位数字,[0-9]{4} 2 月:分为2种可用 0[1-9]、1[0-2] 3 日:最大31分为3种 0[1-9]、1[0-9]、2[0-9]、3[0-1] 4 0[1-9]、[12][0-9]、3[0-1] 5 如:2018-09-18 6 [0-9]{4} - (0[1-9]|1[0-2]) - (0[1-9]|[12][0-9]|3[01]) 7 */ 8 9 var regex = /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/; 10 console.log( regex.test("2017-06-10") ); // => true
1 /*数字分隔,如千位数分隔 2 分析:匹配的是从目标后3位开始,从右到左、会用到string.replace方法 3 /(?=(\d{3})+$)/g 先行断言,匹配3个数字,量词最少出现一次,从尾部开始匹配(有问题) 4 /(?!^)(?=(\d{3})+$)/g 5 其他形式:/(?!\b)(?=(\d{3})+\b)/g = /\B(?=(\d{3})+\b)/g 6 */ 7 8 var regex = /(?!^)(?=(\d{3})+$)/g; 9 var result = "12345678".replace(regex, ',') 10 console.log(result); 11 // => "12,345,678" 12 result = "123456789".replace(regex, ','); 13 console.log(result); 14 // => "123,456,789" 15 16 17 var string = "12345678 123456789", 18 regex = /(?!\b)(?=(\d{3})+\b)/g; 19 var result = string.replace(regex, ',') 20 console.log(result); 21 // => "12,345,678 123,456,789"
1 //千分符表示法一个常见的应用就是货币格式化。 2 function format (num) { 3 return num.toFixed(2).replace(/\B(?=(\d{3})+\b)/g, ",").replace(/^/, "$$ "); 4 }; 5 console.log( format(1888) ); 6 // => "$ 1,888.00"
1 /* 2 去除字符串的开头和结尾空白符 3 */ 4 //匹配前后空白符,替换空字符,效率更高 5 function trim(str) { 6 return str.replace(/^\s+|\s+$/g, ''); 7 } 8 console.log( trim(" foobar ") ); 9 // => "foobar"
1 //身份证 ,分析:17位连续数字,最后一位可数字可“x”(旧的身份证是连续15位) 2 // \d{15} \d{17}[\dxX] 3 /^(\d{15}|\d{17}[\dxX])$/
1 /* 2 IPv4地址 3 分析:结构都是 3位数.3位数.3位数.3位数 4 5 iPv4的ip地址都是(1~255).(0~255).(0~255).(0~255)的格式 6 IP地址的长度为32位,分为4段,每段8位。用十进制数字表示,每段数字范围为0~255 7 8 1. 0 - 9 只有一位数字,正则表达式:\d; 9 2. 10 - 99 二位数,十位数1 - 9,个位数 0 - 9,正则表达式:[1-9]\d; 10 3. 100 - 199,百位数 1,十位数个位数均为 0 - 9,正则表达式:1\d\d; 11 4. 200 - 249,百位数 2,十位数 0 - 4,个位数 0 - 9,正则表达式:2[0-4]\d; 12 5. 250 - 255,百位数 2,十位数5,个位数 0 - 5,正则表达式:25[0-5] 13 步骤4、5可以进行一次整合:2([0-4]\d|5[0-5])(200 - 255)。 14 15 \d 16 [1-9]\d 17 1\d\d 18 2([0-4]\d|5[0-5]) 19 重复4次 20 组合起来如下 21 22 */ 23 24 var ipv4 = /^()(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.){4}$/; 25 26 /* 27 0{0,2}\d,匹配一位数,包括 "0" 补齐的。比如,"9"、"09"、"009"; 28 0?\d{2},匹配两位数,包括 "0" 补齐的,也包括一位数; 29 1\d{2},匹配 "100" 到 "199"; 30 2[0-4]\d,匹配 "200" 到 "249"; 31 25[0-5],匹配 "250" 到 "255"。 32 组合起来如下 33 (0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5]) 34 */ 35 36 var ipv4 = /^((0{0,2}\d|0?\d{2}|1\d{2}|2[0-4]\d|25[0-5])\.){4}$/;
1 /* 2 匹配固定电话, 格式0551-88888888、(0551)88888888 3 4 分析:分为区号、号码(不考虑+86) 5 区号是 "0" 开头的 3 到 4 位数字,对应的正则是:0\d{2,3}, 6 号码:7-8位数字,[1-9]\d{6,7} 7 8 */ 9 10 var regexp = [1-9]\d{6,7};
1 /* 2 匹配手机号 3 分析:11位数字,3+8,且都是13开头 4 13[0-9]{9} 13\d{9} 5 6 移动:134,135,136,137,138,139,150,151,157,158,159,182,187,188 7 联通:130,131,132,152,155,156,185,186 8 电信:133,1349,153,180,189 9 10 11 匹配手机号码:^1(3[0-9]|5[0-35-9]|8[025-9])//d{8}$ 12 移动:^1(34[0-8]|(3[5-9]|5[017-9]|8[278])//d)//d{7}$ 13 联通:^1(3[0-2]|5[256]|8[56])//d{8}$ 14 电信:^1((33|53|8[09])[0-9]|349)//d{7}$ 15 */ 16 17 var regexp = /13\d{9}/; 18 var reg = /^1(3[0-9]|5[0-35-9]|8[025-9])//d{8}$/
正则其实并不完美,有时候不是错只是匹配得不够完整
比如身份证你直接可以匹配17个数字就可以了。
还有其他正则匹配:邮箱、浮动数、保留有效小数等等。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
重复是大脑的语言,但大脑会抗拒重复,除非有甜头(大脑喜欢效率)技术、行为和习惯是不断重复塑造出来。
行为源于习惯,习惯是不断重复的行为!
比如:规划每天认真学习2小数,刚开始会好痛苦但慢慢地习惯,不去做反而不舒服。
习惯有好有坏,当在压力下无法做出决定,往往会重复平时的做法。习惯会自动无思考完成。
比如:你开车良好的交通习惯会减少你自己事故发生
参考资料
MDN
《javascript正则表达式迷你书》