美文网首页
正则表达式

正则表达式

作者: 只是为了一个梦想 | 来源:发表于2018-06-25 17:22 被阅读0次

    字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在,正则表达式是一种用来匹配字符串的强有力的武器。

    基础概念

    ^ 开头匹配
    $ 结尾匹配
    /d 匹配数字
    /w 可以匹配一个字母或者数字
    \s 匹配一个空格(包括tab等空白符)
    . 可以匹配任意字符

    • 任意字符
    • 至少一个字符
      ? 代表 0或1个字符
      {n} n个字符
      {n,m} n~m个字符

    特殊字符在正则表达式中需要转义、' \ ',示例:' - '转义为 '-'.
    包括:$、( )、*、+、.、[、?、\、^、{、|

    image.png

    现在匹配一个固定电话、如:010-123456
    \d{3}\-\d{3,8}
    匹配一个手机号码
    ^1[3|4|5|7|8|9][0-9]\d{8}$

    匹配中文: [\u4e00-\u9fa5]

    英文字母:[a-zA-Z]

    数字:[0-9]

    我们平时使用较多的、
    去掉字符串的空格," s m l " --> "sml"
    非正则实现:

    function trim(str) {
        let strArr = []
        for (let i = 0; i < str.length; i++) {
            if (str[i] !== ' ') {
                strArr.push(str[i])
            }
        }
        return strArr.join("")
    }
    

    用正则实现:

    function trim(str) {
        return str.replace(/(\s)/g, "")
    }
    

    我要解决的问题、
    1、姓名:2-10位中文
    ^[\u4E00-\u9FA5]{2,10}$
    2、手机号:支持7、8、11、12位数字
    ^\d{7}$|^\d{8}$|^\d{11}$|^\d{12}$
    3、详细地址:0-60位汉字
    ^[\u4E00-\u9FA50-9]{2,60}$
    4、货物名称:1-20位中文
    ^[\u4E00-\u9FA5]{1,20}$
    5、总件数:1-5594
    /(^[1-4]\d{3}$)|(^5[0-4]\d{2}$)|(^55[0-8]\d{1}$)|(^559[0-4]$)/
    6、重量、体积:0-999.99
    ^([0-9]{1,3})+(.[0-9]{2})?$
    7、金额:1-99999999(整数)
    ^[1-9]\d{0,7}$
    8、备注:0-30字
    ^[\u4E00-\u9FA50-9]{0,30}$

    .*? 是正则固定搭配用法,表示[非贪婪匹配]模式,尽可能匹配少的

    看完这些、其实,我们日常所用的也几乎止步于此,应该算入门了、

    image.png

    任何技能都在于实践!

    看看正则其他玩法、
    数字格式化问题,1234567890 --> 1,234,567,890

    非正则实现:
    function formatCash(str) {
     let formattedStr = ""
     for (let i = 0; i < str.length; i++) {
          if ((i + 1) % 4 === 1 && i !== 0) {
                    formattedStr += " "
                }
                formattedStr += str[i]
      }
      return formattedStr
    }
    
    正则实现:
    function formatCash(str) {
      let strRes = str.replace(/(\d{4})(?=[^$])/g, "$1 ")
      return strRes
    }
    

    ?=exp 零宽度正预测先行断言 以下正则表达式匹配以ed结尾的单词的前面部分:\b\w+(?=ed\b)。 ?<=exp 又称为零宽度正回顾后发断言 以下正则表达式匹配以an开头的单词的后面部分,即匹配单词除了字符串an之外的部分:(?<=\ban)\w+\b

    再来一个面试中经常被问的、字符串数组去重。

    es6写法:
    let strArr=["a","b","c","a","b","c"]
    function unique(arr){
      return [...new Set(arr)]
    }
    
    es5写法:
    function unique(arr) {
        return arr.filter(function(ele, index, array) {
            return array.indexOf(ele) === index
        })
    }
    
    正则表达式实现:
    function unique(arr) {
        return arr.sort().join(",,").
        replace(/(,|^)([^,]+)(,,\2)+(,|$)/g, "$1$2$4").
        replace(/,,+/g, ",").
        replace(/,$/, "").
        split(",")
    }
    

    这里有了一个多次出现的词,replace(),我们了解下replace,来自W3C.
    replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

    stringObject.replace(regexp/substr,replacement)
    

    最近的一个需求、确定微信浏览器是否大于等于5.0

    function wxVersion(str){
        const ua = window.navigator.userAgent.match(/micromessenger\/[\d.]+/gi)
        return (ua+"").replace(/[^0-9.]/ig,"")
    }
    
    image.png

    相关文章

      网友评论

          本文标题:正则表达式

          本文链接:https://www.haomeiwen.com/subject/akhtsftx.html