• 正则表达式的应用


    正则常用的方法:

    1.test

    正则去匹配字符串,如果匹配成功就返回真,匹配失败就返回假

    写法:正则.test(字符串)

    .search

    正则去匹配字符串,如果匹配成功,就返回匹配成功的位置,如果匹配失败就返回-1

    search的写法:字符串.search(正则)

    3.match

    正则去匹配字符串,如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null

    match的写法:字符串.match(正则)

    4.replace

    正则去匹配字符串,匹配成功的字符去替换新的字符串

    replace的写法:字符串.replace(正则,新的字符串)

    四.正则表达式字符类

    字符类:一组相似的元素(用[]表示[]的整体代表一个字符,()是分组和子项的意思)

    1.任意字符

    [abc]

    如o[usb]t--obt、ost、out

    2.范围

    [a-z]、[0-9]

    如id[0-9]--id0、id5

    3.排除

    [^a]

    如o[^0-9]t--oat、o?t、o t

    例子:过滤标签

    过滤掉<>(如<div>、</div>、<h2 class="sfsdf">)

    var re=/<[wW]+>/g;  //中括号里是或的关系,也就是字符或非字符都有了,包括了斜杠,引号等

    另一种做法:    var re=/<[^>]+>/g;

    五.正则表达式转义字符

    .(点):任意字符       .:真正的点

    s(S):空格(非空格)

    d(D):数字(非数字)

    w(W):字符(非字符)   字符包括字母、数字、下划线

    数字:重复子项(1:重复的第一个子项,2:重复的第二个子项...)

    题目1:把 on-index-text 通过正则的方法替换为onIndexText

    思路:找到"-" 的下一个字母,然后把它转成大写

    replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

    stringObject.replace(regexp/substr,replacement)
    参数一:可以是字符串也可以是正则表达式
     参数二:可以是字符串,也可以是函数
    function toChange(string) {
    let reg = new RegExp('-.{1}','g') // .{1}表示在-后的第一个位置的字符 g 表示全局匹配
    let result = string.replace(reg,function(word){
    return word.substring(1,2).toUpperCase()
    })
    return result
    }

    题目2:把2018-5-6替换成2018.6.5
    function toChange2(string) {
    let reg= /(d+)(-)/g
    let result = string.replace(reg,function ($0,$1,$2) { // $0为匹配的全部数组 $1为第一个()匹配的数据 $2()为第二个()匹配到的数据
    return $1+'.'
    })
    return result
    }
    console.log(toChange2('2018-5-6')) // 2018.5.6

    题目3:将数值用千位表示法表示 12345替换成12,345
    什么是单词边界?指代的是词与单词分隔符(通常是空白字符)之间的位置,非单词边界就是没有与单词分隔符相邻的位置
    hello world
    第一个o和后面的空格之间就是单词边界,第二个o则没有与单词边界相连
    o可以匹配第一个o,因为它相邻着一个单词边界
    oB可以匹配第二个o,因为它没有相邻单词边界(隔了一个h)

    前瞻:(?=)和(?!)

    前瞻分为正向前瞻和反(负)向前瞻,正向前瞻(?=表达式)表示后面要有什么,反向前瞻(?!表达式)表示后面不能有什么。

    前瞻分组会作为匹配校验,但不出现在匹配结果字符里面,而且不作为子匹配返回。

    //将该num转化为字符串后,全局(/g)正向匹配,看是否符合断言(?=(?:d{3})+$)部分,直到匹配结束。即遇到 数字 + 该数字后面紧跟连续的三位数字(并且不管这连续的三位数字出现多少次),符合则在该数字(’$1’)后加入逗号,替换的时候忽略(?:)这连续的三位数.
    function toThousands(num) {
    return (num || 0).toString().replace(/(d)(?=(?:d{3})+$)/g, '$1,'); // B表示匹配非单词边界 ?=匹配一个位置 ?:为非捕获性分组
    }
    console.log(toThousands(12344566))

    function toThousands(num) {
    return (num || 0).toString().replace(/(B)(?=(d{3})+$)/g, ','
    ); // B表示匹配非单词边界 那么匹配到是2-3之间的位置,然后用','替换
    console.log(toThousands(12344))

    题目4:替换敏感词
    function changeWord(string){
    let reg = new RegExp("rrr|ggg",'g')

    return string.replace(reg,`<span style="color:red">***</span>`
    )
    }
    let string = document.getElementById('test')
    console.log(string.innerHTML)
    string.innerHTML = changeWord(string.innerHTML)

    题目5:
    找某个字符串中出现最多的字符和它一共出现多少次 
    //找某个字符串中出现最多的字符和它一共出现多少次 
    /*
    先把字符串拆为数组,然后进行排序,然后再转为字符串
    * */
    function findMore(str) {
    let arr=str.split("");
    str=arr.sort().join("");
    let value = '' // 存放出现最多的字符
    let index = 0 //存放次数
    let reg = /(w)1+/g // 1+ 表示出现一次以上
    str.replace(reg,function ($0,$1) {//$0代表整体,$1代表第一个子项
    if (index < $0.length) {
    index = $0.length //$0:每一组重复的元素
    value = $1
    }
    })
    alert('出现最多的字符是'+value+',出现次数是'+index);

    }
    findMore('vbbbbhybbfhbbgbbb')

    题目6 :去掉字符串的空格
    // 去掉字符串的前后的空格
    function trim(string) {
    let reg = /^s|s$/g
    return string.replace(reg,'')
    }

    题目7:向前声明和反向前声明

    (?=) :前向声明

    (?!):反前向声明

    function forntTest(string) {
    let reg = /a(?=b)/g
    return string.replace(reg,'*')
    }
    console.log(forntTest('abacad')) // *bacad

    function forntTest(string) {
    let reg = /a(?!b)/g
    return string.replace(reg,'*')
    }
    console.log(forntTest('abacad')) // ab*c*d

    题目8: 匹配日期
    function checkDates(str) {
    return /(d{4})(-|/|.)(d{2}2(d{2}))/.test(str) // 2为前面匹配的第二分组
    }
    能匹配 2018-05-06 2018.05.06 2018/05/06

    题目9:每个单词的首字母转成大写
    // 每个单词的首字母转成大写
    function titleize(str) {
    let reg = /(w)/g
    //return str.match(reg)
    return str.replace(reg,function (word) {
    return word.toUpperCase()
    })
    }

    题目10
    // 驼峰表示法
    function changeShow(str) {
    let reg = /(s).{1}/g
    return str.replace(reg,function (word) {
    console.log(word)
    return word.toUpperCase()
    })
    }
    console.log(changeShow('wo men de'))

    题目11:

    // 匹配成对标签
    function checkSymbol(str) {
    let reg = /<([^>]+)>[dD]*<(/1)>/g // [dD] 1反向引用前面第一个()
    return reg.test(str)
    }

    题目12:
    //非贪婪匹配
    function noMore(str) {
    let reg = /d{2,3}?/g // 量词后面? 表示非贪婪匹配
    return str.match(reg)
    }
    console.log(noMore("1234,456,46,33")) // ["12", "34", "45", "46", "33"]

    题目13:
    //匹配时间
    /*
    * 共4位数字,第一位数字可以为[0-2]。

    当第1位为2时,第2位可以为[0-3],其他情况时,第2位为[0-9]。

    第3位数字为[0-5],第4位为[0-9]*/
    function parttenTime(str) {
    let reg = /([0-1][0-9]|[0-2][0-3]):([0-5])([0-9])/g
    return str.match(reg)
    }
    console.log(parttenTime("09:40 02:10"))

    题目14:
    // 验证密码问题 密码长度6-12位,由数字、小写字符和大写字母组成,但必须至少包括2种字符。

    function checkPWS(str) {
    //let reg = /(?=.*[0-9])^[0-9a-zA-Z]{6,12}/g // 必须包含数字
    //let reg = /(?=.*[0-9])(?=.*[a-z])^[0-9a-zA-Z]{6,12}/g // 必须同时包含数字和小些字母
    //let reg = /(?=.*[0-9])(?=.*[A-Z])^[0-9a-zA-Z]{6,12}/g // 必须同时包含数字和大些字母
    let reg = /((?=.*[0-9])(?=.*[A-Z])|(?=.*[0-9])(?=.*[a-z])|(?=.*[A-Z])(?=.*[a-z]))^[0-9a-zA-Z]{6,12}/g
    return reg.test(str)
    }
    参考https://zhuanlan.zhihu.com/p/27355118


  • 相关阅读:
    MJExtension的使用
    Swift
    2月22号 UITableView
    1月25号 CALayer
    1月22号 animation—1
    1月22号 KVC KVO
    2016.01.22 简单动画
    2016.01.22 KVC&KVO
    2016.01.22 单例模式(Singleton)
    2016.01.21 UITabBarController
  • 原文地址:https://www.cnblogs.com/liangshuang/p/9000182.html
Copyright © 2020-2023  润新知