正则表达式

120 阅读1分钟

定义正则表达式方式有两种

  • 直接量语法

    /pattern/attibutes

  • 创建RegExp对象的语法

    new RegExp(pattern, attributes)

可以把/pattern/attibutes放到new RegExp(pattern, attributes)pattern 中创建两个不一样的对象。

修饰符(attibutes)

  • i

    忽略大小写

  • g

    全局匹配

  • m

    执行多行匹配。请看下面的例子

    var reg = /^[a-z]/gm
    var reg2 = /^[a-z]/g
    var str = 'ab\nc\na'
    str.match(reg) // ["a", "c", "a"]
    str.match(ref2) // ["a"]
    

表达式

pattern 可以使用表达式的方式进行匹配

1. 方括号

[] 用于表示查找某个范围内的字符

2. 元字符

元字符即拥有特殊含义的字符


.       // 表示除换行\n和行结束符\r以外的 
/w === [0-9A-z_]
/W === [^/w]
/d === [0-9]
/D === [^/d]
/s === [/n/t/f/r/v]
/S === [^/s]
/b === 单词的边界   
/B === 非单词边界
...

3. 量词

量词的使用都是贪婪算法,能多则不少,如果想要使用少的情况,可以在任何量词后面使用


n+      [1, ]
n*      [0, ]
n?      [0,1]
n{x}    [x]
n{x,y}  [x, y]

n$   // 匹配任何结尾为n的字符串
^n   // 匹配任何开头为n的字符串
?=n  // 匹配任何其后紧跟指定字符串n的字符串
?!n  // 匹配任何其后没有紧跟指定字符串n的字符串

RegExp 对象方法

  • exec()
  • test()

支持正则表达式的string对象的方法

  • search()
  • match()
  • replace()
  • split()

其他

正向预查(正向断言)

// 查找以b结尾的字符,但不包括b
var str = 'abacbaa'
var reg = /\w(?=b)/g
// var reg = /\w(?!b)/g
str.match(reg) // ['a', 'c']

题目

// (2014年百度最后一题)科学计数法:把 100000000 改成 10.000.000
// 思路:
//    1. 从后往前匹配3的倍数; //  /((/d{3})+$)/g
//    2. 匹配的是空字符;      //  正向预查 /?=((/d{3})+$)/g
//    3. 把该空字符替换成 . ;  //  replace()
//    4. 边界的匹配规则取消;  //  /?=(\B)((/d{3})+$)/g

var str = '100000000'
var reg = /?=(\B)((\d{3})+$)/g
str.str.replace(reg, '.')  //  100.000.000

待续...