zoukankan      html  css  js  c++  java
  • (转)正则表达式小括号的多义性

    原文地址:http://www.cnblogs.com/snandy/p/3650309.html

    小括号在正则表达式这有以下意义

    • 限定量词作用的范围
    • 限定多选结构的范围
    • 为反向引用捕获文本
    • 分组捕获
    • 只分组不捕获
    • 前瞻

    一、限定量词作用的范围

    1
    2
    3
    var reg1 = /(Matz)?/; // 0或1个Matz
    var reg2 = /(Matz)+/; // 1个以上Matz
    var reg3 = /(Matz)*/; // 0或多个Matz

      

    二、限定多选结构的范围

    1
    2
    3
    4
    var reg = /(Matz|Eich)/
    reg.test('Matz') // => true
    reg.test('Eich') // => true
    reg.test('John') // => false

      

    三、为反向引用捕获文本

    1
    2
    3
    4
    5
    6
    var reg = /(boy)1/ // 相当于 /boyboy/
    reg.test('boy') // => false
    reg.test('boyboy') // => true
     
    var reg /(boy)(girl)12/
    reg.test('boygirlboygirl') // => true

      

    四、分组捕获

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var reg1 = /(d{3}) (d{3})/
    var str = '111 222'
    str.replace(reg1, '$2 $1') // => '222 111' , 注意这里的$2,$1,存放了匹配的字符串
     
    var reg2 = /(d{3})(d{4})(d{4})/
    var mobile = '13522722724'
    reg2.test(mobile)
    RegExp.$1 // => 135
    RegExp.$2 // => 2272
    RegExp.$3 // => 2724
     
    var reg3 = /(d{3})(d{4})(d{4})/
    var mobile = '13522722724'
    mobile.replace(reg3, '$1 $2 $3') // => '135 2272 2724'

      

    五、只分组不捕获(和 "?:" 一起)

    1
    2
    3
    var reg = /(?:d+)/
    reg.test('13522722724')
    RegExp.$1 // => '' 不存储匹配的元素

    较长的正则表达式中,反向引用会降低匹配速度,性能降低,不需要反向引用时应使用分组不捕获。

    六、前瞻(lookahead,和 "?=" 一起)

    它告诉正则表达式向前看一些字符但不移动位置,前瞻不匹配任何字符只匹配文本中的特定位置。

    1
    2
    3
    4
    5
    var reg = /(John) (?=Resig)/
    reg.test('John') // => false
    reg.test('John Backus') // => false
    reg.test('John Reisg') // => true
    RegExp.$1 // => 'John',注意这里不是 "John Resig"

    如下是一个利用前瞻实现手机号格式化的小函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    /*
     * 手机号分隔
     * 13522722724 -> 135 2272 2724
     */
    function separateMobile(num) {
        var arr = ( '0' + num ).replace(/(d{4})(?=d)/g,"$1 ").split('')
        arr.shift()
        return arr.join('')
    }

      

  • 相关阅读:
    获取项目中.txt 文件的内容
    jdbc 连接各种数据库
    修改Eclipse中项目在Apache Tomcat中的部署路径
    java学习之继承之子父类中变量的特点
    java学习之继承、多态
    java学习之单例模式(饿汉式与懒汉式)
    java学习之对象初始化过程
    java学习之静态块、显示初始化块、构造函数、this在构造函数中的调用,区别联系与调用顺序
    java学习之数组的两种常见错误
    java学习之堆与栈的区别
  • 原文地址:https://www.cnblogs.com/fcsh820/p/3672338.html
Copyright © 2011-2022 走看看