正则表达式(项目总结-重构)

在项目中,经常会遇到密码和填写手机号的业务,然后我们就需要对输入的密码和手机号进行校验,看输入的是否合乎标准,于是就需要用到正则表达式来验证。

手机号的验证:

 if(!/^1[0-9]{10}$/g.test(cellphone)){
       popup.popup({msg: '请填写正确的手机号码'});
       return;
    }
    /^1[0-9]{10}$/g.test(cellphone)

以1开头,10个数字结尾,然后test进行验证

密码:密码中大部分只包含数字和字母,所以也需要正则表达式来判断一下

 function valPwd(v){
    var r=/^[a-zA-Z0-9]+$/g;
    return r.test(v);
    }
    alert(valPwd('111111111111'));//true
    alert(valPwd('aaaaaaaa'));//true
    alert(valPwd('23423szf234'));//true
    alert(valPwd('!#sdfafasdf'));//false
    alert(valPwd('我的234234'));//false
    </script>
 var r=/^[a-zA-Z0-9]+$/g;   // 就是以大小写字母和数字开头,然后只包含大小字母和数字。
    
    /^[a-zA-Z0-9]+$/g.test();

上面都是之前总结的,但是对于正则表达式中各种符号的概念还是很模糊,昨天晚上有读了几篇正则表达的文章,又试着跟着去写了一些正则表达式,慢慢也了解和记住了一些符号的概念和作用。
咱们就以上面写的例子来具体分析一下

  /^1[0-9]{10}$/g
    
    1. ^匹配输入字符串的开始位置,除非在方括号[]表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^var a = /[^3-9]/   // ^放在[]中表示非的意思
    a.test(1)
     // true
    a.test(3)
    // false
    
    var b = /^[3-9]/  // ^放在[]外面表示以什么开头的意思
    b.test(1)
     // false
    b.test(3)
      //true

    2. [0-9]的含义:
     在正则表达式里,集合的定义方式是使用中括号[]。如/[123]/这个正则表示只要包含123中任何一个,就能匹配。
     那如果我想匹配所有的数字怎么办呢?从0写到9显然太过低效,所以元字符-就可以用来表示区间范围,
     利用/[0-9]/,表示只要包含09任何一个数字就可以匹配, /[a-z]/则表示只要包含a到z任意一个英文小写字母,
     就可以匹配。

    3.{10}的含义
    在某些情况下,我们需要匹配特定的重复次数,元字符{}用来给重复匹配设置精确的区间范围。
    如'a'我想匹配3,那么我就使用/a{3}/这个正则,或者说'a'我想匹配至少两次就是用/a{2,}/这个正则。
   
     以下是完整的语法:
    
    - {x}: 至少x次
    
    - {min, max}: 介于min次到max次之间,如果min和max一样的话,相当于{min}至少min次 例如:/a{2,2}/g.test("aaaabcaaaa") // true
    
    - {min, }: 至少min次
    
    - {0, max}: 至多max次
    
    4.(10)的含义
    var num = /^2(10)/
    num.test(2100)
    // true
    num.test(2200)
    //  false

    综上所述:
    小括号就是括号内看成一个整体 ,中括号就是匹配括号内的其中一个,大括号就是匹配几次
      
    5.$
     $的含义是以什么为结尾 
    
   6. 元字符?代表了匹配一个字符或0个字符。设想一下,如果你要匹配color和colour这两个单词, 0 | 1
    就需要同时保证u这个字符是否出现都能被匹配到。所以你的正则表达式应该是这样的:/colou?r/7. 元字符*用来表示匹配0个字符或无数个字符。通常用来过滤某些可有可无的字符串。>= 0
   
   8. 元字符+适用于要匹配同个字符出现1次或多次的情况。 >= 1
    
    补充:上面的验证手机号的正则表达式也可以这样的写
    var tele = /^1\d{10}$/
    tele.test(18066666600)
    true
    tele.test(180666661256)
    false
   
    9.单个数字, [0-9] 
     \d
    digit
    
    来看一下digit是什么意思
    digit	英[ˈdɪdʒɪt][ˈdɪdʒɪt]
    n.	(09 的任何一个) 数字,数位; 手指; 拇指; 脚趾;
    
    10.除了[0-9]
    \D
    not digit
    
    11. 包括下划线在内的单个字符,[A-Za-z0-9_]
    \w
    word
    
    12.非单字字符  匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’
    \W
    not word
      
   13. 匹配空白字符,包括空格、制表符、换页符和换行符
    \s
    space
    
    14.匹配非空白字符
    \S
    15.除了换行的任意字符 .
    .  例如:(?=.*[a-z])这个表达式中的.表示的就是除了换行的任意字符 。
    16.正则表达式中的 \b
    以前经常看到类似这样的正则表达式:\bhi\b 不知道什么意思
    原来\b是正则表达式规定的一个特殊代码,也叫元字符,\b代表着单词的开头或结尾,也就是单词的分界处。
   let name = 'aaa bbb ccc';
   let uw=name.replace(/\b\w+\b/g, function(word){
	   return word.substring(0,1).toUpperCase()+word.substring(1);
   });
   关于replace的用法请进:https://www.w3school.com.cn/jsref/jsref_replace.asp
   console.log(uw)   // Aaa Bbb Ccc
    综上,我们来看一下例子
    在本例中,我们将把 "Doe, John" 转换为 "John Doe" 的形式:
    name = "Doe, John";
    name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");
    分析 \w  word表示包括下划线在内的单个字符,[A-Za-z0-9_],元字符+适用于要匹配同个字符出现1次或多次的情况。
    ()小括号就是括号内看  成一个整体,    \s  space  匹配空白字符,包括空格、制表符、换页符和换行符,   
    元字符*用来表示匹配0个字符或无数个字符。通常用来过滤某些可有可无的字符串。
    这样(\w+)\s*就表示以一个或多个字符开头也就是单词开头,以0个或者多个空格或者其他空白字符结尾,这样就筛选出了第一个单词,然后     $1就对应这第一个单词,
    用同样分析的方法可以筛选出第二个单词,\s*(\w+)以空格+单词对应$2,然后$1,$2互换就实现了把单词互换的效果。
    
    6. i的含义 - ignore的缩写 表示忽略大小写
    let text234 = "javascript Tutorial";
    text234.replace(/javascript/i, "JavaScript");
     "JavaScript Tutorial"
     let tes1 = "Javascript is good"
     let tes2 = /javascript/i
     tes2.test(tes1)  // true
    
   下面我们来看一下这样一个正则表达式,这个正则表达式的含义就是校验8~20位必须包含数字、字母和特殊字符的密码,让我们一步步来分析一下
   let psdReg = /^(?=.*\d)(?=.*[a-zA-Z])(?=.*[~!@#$%^&*])[\da-zA-Z~!@#$%^&*]{8,20}$/;
   psdReg.test('123!@#sed')
    // true
   psdReg.test('!@#sed123')
   //  true
   psdReg.test('sed!@#123')
   //  true
   psdReg.test('123!@#123')
   //  false
   psdReg.test('@@@!@#qwe')
   /// false
   上面是验证各种类型密码的结果,说明这个正则表达式是符合我们的要求的。
   let psdReg = /^(?=.*\d)(?=.*[a-zA-Z])(?=.*[~!@#$%^&*])[\da-zA-Z~!@#$%^&*]{8,20}$/;
   这个正则表达式中有三个()包裹的内容,从上面的文档中我们知道()表示需要匹配括号里面的内容,每个小括号中的开头都是  ?=.*  why?
   意思是断言,只匹配一个位置。
   例如:
   想匹配一个“人”字,但是只想匹配中国人的人字,不想匹配法国人的人,就可以用一下表达式
   (?=中国)所以,楼主的表达式与其他通配符连用才能起到效果。
   (?=.*[a-z])\d+
   这个就表示 匹配以“任意字符连着一个小写字母”开头的数字,只匹配数字。
    这个(?=.*\d)中每个字符的含义
   .表示匹配除"\n"(换行符)"\r"(回车符)之外的任何单个字符。
   *表示匹配前面的子表达式任意次。例如,zo*能匹配"z",也能匹配“zo”以及“zoo”。*等价于{0,},但是必须要按照顺序来,zo*能匹配"z",但是不能匹配"o".*这个表示贪婪匹配---正则表达式一般趋向于最大长度匹配,总是尝试匹配尽可能多的字符,也就是所谓的贪婪匹配。下面用例子说明一下什么叫贪婪匹配
   let tanlan = /ab.*c/
   tanlan.test('abscwcyc');// true
   如上面使用模式tanlan匹配字符串'abscwcyc',结果就是匹配到:'abscwcyc',当出现c时,它还是继续向后找,又找到c,它就把scwcy当做是(.*)的匹配
   .*?这个表示非贪婪匹配---非贪婪匹配就是匹配到结果就好,总是尝试匹配尽可能少的字符。下面用例子说明一下什么叫非贪婪匹配。
   let tanlan = /ab.*c/
   tanlan.test('abscwcyc');// true
   如上面使用模式tanlan匹配字符串'abscwcyc',结果就是匹配到:'absc',当出现c时,它就会停止查找,它就把s当做是(.*)的匹配。
   
   ()表示将(和)之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用\1和\9的符号来引用。
   (?=pattern)表示费获取匹配,正向肯定预查,在任何匹配pattern的字符串开始匹配查找字符串,该匹配不需要获取以后使用。例如,“window(?=95|98|XT|2000)”能匹配“window2000”中的“window”,但不能匹配“window3.1”中的“window”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是包含预查的字符之后开始。
   let psdReg = /^(?=.*\d)(?=.*[a-zA-Z])(?=.*[~!@#$%^&*])[\da-zA-Z~!@#$%^&*]{8,20}$/;
   第一个括号里面标识必须匹配到数字\d   =====  (?=.*\d)
   
   第二个括号表示必须匹配到字母 =====  (?=.*[a-zA-Z])

   第三个括号中表示必须匹配到特殊字符~!@#$%^&* ====== (?=.*[~!@#$%^&*])
   
   第四个中括号表示字符集合,匹配所包含的任意一个字符 并规定了字符的个数的上限和下限。
   
   四个条件由()括号取和集同时成立

 
   str.replace(/\s/g, '').replace(/(.{4})/g, "$1 ")
   我们来看一下这个正则表达式的含义
   首先\s代表匹配空白字符,包括空格、制表符、换页符和换行符,第一个replace的含义是替换字符串中的空格,那第二个replace的作用呢?
   我们先解析一下/(.{4})/g的含义:()代表一个整体,需要匹配整个括号   .表示匹配除"\n"(换行符)"\r"(回车符)之外的任何单个字符  {4}表示匹  配字符的重复次数,我们来看一下实际效果
   let string = `1327543 1257132 43521dasgf`
   string.replace(/\s/g, '').replace(/(.{4})/g, "$1 ")
   //  "1327 5431 2571 3243 521d asgf "
   从这个例子中我们就可以看出这个str.replace(/\s/g, '').replace(/(.{4})/g, "$1 ")代表的含义是给字符串中的每四个字符增加一个空格

今天遇到一个这样的需求就是校验一下,检验一串字符串中是否包含两个或者以上的小数点。来看一下今天探索的步骤

/\.{2,}/g.test('123..3') // true
/\.{2,}/g.test('123.3.') // false
/\.{2,}/g这个只能校验两个或者更多的小数点挨着的字符串
如果不是挨着的,就校验不了
我们先来看一下这个下面的这两个概念:

.表示除了换行符\n之外的所有字符
*表示包含0或多个(>=0.*这个表示贪婪匹配

我先简单这样写了一下

/.*\..*\./
/.*\..*\./g.test("1..2") // true
/.*\..*\./g.test("1.2.") // true
这个可以满足基本的需求
第一个.*\.这个表示小数点前有0到多个字符,第二个.*\.表示第二个小数点和第一个小数点之间有0到多个字符。
我又做了优化,如下:
/(.*\.){2,}/g.test("1..2") // true
/(.*\.){2,}/g.test("1.2.3.4.5") // true
更符合一些

正则表达式中的match方法

'abc123asd2n3n4n4'.match(/\d/);
// ["1", index: 3, input: "abc123asd2n3n4n4", groups: undefined]
// 如果不加g,会找出第一个

'abc123asd2n3n4n4'.match(/\d/g);
// ["1", "2", "3", "2", "3", "4", "4"]
// 如果加g(全局搜索),会找出所有符合条件的

'34[abc]'.match(/^\d+\[/)
// ["34[", index: 0, input: "34[abc]", groups: undefined]

'34[abc]'.match(/^(\d+)\[/)
//  ["34[", "34", index: 0, input: "34[abc]", groups:undefined]
// 如果加(),就代表捕获的意思,会捕获到想要的这个字符

今天碰到一个这样的正则表达式

eventNotUpload.length.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,')
我们主要是看(?:)这个正则表达式中的用法,
(?:pattern)
()表示捕获分组,()会把每个分组里的匹配的值保存起来,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推

(?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来

以后关于正则表达式的总结都会补充到这篇文章里面,等待后续补充更新吧,加油

推荐一遍不错的文章正则表达式不要背

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值