快速解决正则(续)---属性、方法、综合应用

属性

  常见 

  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"]
匹配16进制的颜色值
//匹配时间
 //分析时间:第一位: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}$/;
IP地址

 

 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正则表达式迷你书》

 

posted @ 2018-09-19 10:38  冰锐格  阅读(149)  评论(0编辑  收藏  举报