美文网首页
正则表达式

正则表达式

作者: yuhuan121 | 来源:发表于2017-07-15 13:24 被阅读0次

    正则表达式图形化工具

    正则表达式的基本语法

    正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。

    创建(建议字面量方式)

    var reg=/<%[^%>]%>/g;
    

    最后的g代表全局
    RegExp实例对象有五个属性:
    g:global,全文搜索,默认是false,不添加的话搜索到第一个结果停止搜索
    i:ingore case,忽略大小写,默认对大小写敏感
    m:multiple lines,多行搜索,默认值是false
    l: lastIndex,是当前表达式模式首次匹配内容中最后一个字符的下一个位置,每次正则表达式成功匹配时,lastIndex属性值都会随之改变
    s:source,正则表达式的文本字符串

    元字符

    元字符:在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符

    ( [ { \ ^ $ | ) ? * + .
    

    字符类

    正则表达式一个字符(转义字符算一个字符)对应字符串一个字符

    可以使用元字符[]来构建一个简单的类,所谓类是泛指符合某些特征的对象。我们可以使用表达式 [abc] 把字符a或b或c归为一类,表达式可以匹配这类的字符。

    取反

    元字符[]组合可以创建一个类,我们还可以使用元字符^创建反向类/负向类,反向类的意思是不属于XXX类的内容,表达式 [^abc] 表示不是字符a或b或c的内容

    范围类

    我们可以使用 x-y来连接两个字符表示从x到y的任意字符,这是个闭区间,也就是说包含x和y本身,这样匹配小写字母就很简单了

    [a-z]
    

    要是想匹配所有字母呢?在[]组成的类内部是可以连写的,我们还可以这样写 [a-zA-Z]

    预定义类

    正则表达式为我们提供了几个常用的预定义类来匹配常见的字符,进一步简化使用



    例如希望匹配一个 ab+数字+任意字符 的字符串,就可以写成 ab\d.

    边界匹配字符

    \\手机号码匹配 以1开头 长度为10 以此为结尾
    var reg = /^1\d{10}$/
    '13301693108'.match(reg) //["13301693108"]
    '1330169310822'.match(reg) //null
    
    #匹配以hello作为右边界、左边界
    'hello worhellod hello'.match(/\bhello\b/g) //["hello", "hello"] 
    
    'hello wor-hello-d hello'.match(/\bhello\b/g)// ["hello", "hello", "hello"]
     //值得注意的是,中横线也会被认为是单词边界
    

    量词

    #匹配[a-z]后面跟(一个或0个)数字字符
    'a1234567b45dgf78'.match(/[a-z]\d?/g) //["a1", "b4", "d", "g", "f7"]
    #匹配[a-z]后面跟(一个或多个)数字字符
    'a1234567b45dgf78'.match(/[a-z]\d+/g) //["a1234567", "b45", "f78"]
    #匹配[a-z]后面跟(0个或多个)数字字符
    'a1234567b45dgf78'.match(/[a-z]\d*/g)//["a1234567", "b45", "d", "g", "f78"]
    

    贪婪模式与非贪婪模式

    量词在默认下是尽可能多的匹配的,也就是大家常说的贪婪模式

    '123456789'.match(/\d{3,5}/g); //["12345", "6789"]
    

    既然有贪婪模式,那么肯定会有非贪婪模式,让正则表达式尽可能少的匹配,也就是说一旦成功匹配不再继续尝试,在量词后加上?即可

    '123456789'.match(/\d{3,5}?/g); //["123", "456", "789"]
    

    分组

    有时候我们希望使用量词的时候匹配多个字符,而不是像上面例子只是匹配一个,比如希望匹配Byron出现20次的字符串,我们如果写成 Byron{20} 的话匹配的是Byro+n出现20次

    怎么把Byron作为一个整体呢?使用()就可以达到此目的,我们称为分组

    (Byron){20}
    

    如果希望匹配Byron或Casper出现20次该怎么办呢?可以使用字符|达到或的功效

    (Byron|Casper){20}
    

    前瞻

    (/good(?=Byron)/).exec('goodByron123'); //['good']
    (/good(?=Byron)/).exec('goodCasper123'); //null
    (/bad(?=Byron)/).exec('goodCasper123');//null
    

    RegExp.prototype.test(str)

    方法用于测试字符串参数str中是否存正则表达式模式,如果存在则返回true,否则返回false

    #检测是否为手机号码
    function isPhoneNumber(str){
      console.log((/^1\d{10}$/).test(str))
    }
    

    RegExp.prototype.exec(str)

    方法用于正则表达式模式在字符串中运行查找,如果exec()找到了匹配的文本,则返回一个结果数组,否则返回 null

    除了数组元素和length属性之外,exec()方法返回对象还包括两个属性。

    1.index 属性声明的是匹配文本的第一个字符的位置
    2.input 属性则存放的是被检索的字符串string

    var str2 = 'hallo jirengu, hbllo world, hcllo ruoyu'
    var reg = /h[a-z]llo/g
    do{
      result = reg.exec(str2)
      console.log(result)
    }while(result)
    

    String.prototype.search(reg)

    search() 方法用于检索与正则表达式相匹配的子字符串,不执行全局匹配,从字符串的开始进行检索,总是返回字符串的第一个匹配的位置

    String.prototype.match(reg)

    match()方法将检索字符串,以找到一个或多个与reg匹配的文本。
    通过增加g可控制其采用全局调用或非全局调用

    String.prototype.replace(reg, replaceStr)

    'abcabcabc'.replace(/bc/g,'X'); //aXabcabc
    

    String.prototype.replace(reg, function)

    通过自定义函数,replace可以实现很多强大的功能,尤其是在复杂的字符串替换语句中经常使用

    #希望把一个字符串中所有数字,都用小括号包起来
    '2398rufdjg9w45hgiuerhg83ghvif'.replace(/\d+/g,function(r){
        return '('+r+')';
    }); //"(2398)rufdjg(9)w(45)hgiuerhg(83)ghvif"
    

    相关文章

      网友评论

          本文标题:正则表达式

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