JavaScript 正则表达式

参考资源:
慕课网 JavaScript 正则表达式
正则表达式的可视化开源工具

JavaScript 正则表达式

REGEXP 对象

JavaScript 通过内置对象 RegExp 支持正则表达式,有两种方法实例化 RegExp 对象

  • 字面量
  • 构造函数

字面量

1
var reg = /\bis\b/g

构造函数

1
var reg = new RegExp("\\bis\\b", "g")

修饰符

gglobal 全文搜索,不添加则搜索到第一个匹配停止
iignore case 忽略大小写,默认大小写敏感
mmultiple lines 多行搜索

元字符

正则表达式由两种基本字符类型组成

  • 原义文本字符如字母 a,表示的就是小写英文字母 a
  • 元字符元字符是在正则表达式中有特殊含义的非字母字符
    * + ? $ ^ . | \ ( ) { } [ ]

字符类

  • 一般情况下正则表达式一个字符对应字符串一个字符
  • 表达式 ab\t 的含义就是

有时候需要匹配某一类字符

  • 我们可以使用元字符 [] 来构建一个简单的类
  • 所谓类是指符合某些特性的对象,一个泛指,而不是特质某个字符
  • 表达式 [abc] 把字符 abc 归为一类,表达式可以匹配这类的字符

字符类取反

  • 使用元字符 ^ 创建 反向类/负向类
  • 反向类的意思是不属于某类的内容
  • 表达式 [^abc] 表示不是字符 abc 的内容

范围类

  • 我们可以使用 [a-z] 来连接两个字符,表示从 az 的任意字符
  • 这是个闭区间,也就是包含 az 本身
  • 在 [] 组成的类内部是可以连写的 [a-zA-Z]

预定义类

正则表达式提供预定义类来匹配常见的字符类

边界

常用边界匹配字符

量词

希望匹配一个连续出现 20 次数字的字符串

贪婪模式

正则尽可能的匹配,例如匹配 3-6 个数字,\d{3,6},在一串数字中,例如 12345678 ,匹配的结果为 123456

非贪婪模式
让正则尽可能少的匹配,也就是说一旦匹配成功不再继续尝试就是非贪婪模式,直接在量词后加上 ? 即可,例如

1
2
"123253253455".match(/\d{3,6}?/g)
// ["123", "253", "253", "455"]

分组

使用 ( ) 可以达到分组的功能,使量词作用域分组,例如

(lyctea){3}

或用 | 表示或,例如

lyctea|luoyecong

luoye(c|cong)

反向引用

例如将用 - 连接的日期,转成 / 表示的日期格式

1
2
"2017-03-30".replace(/(\d{4})-(\d{2})-(\d{2})/g, "$2/$3/$1")
// "03/30/2017"

忽略分组
不希望捕获某些分组,只需要在分组内加上 ? : 就可以

(?:Byron).(ok)

前瞻

  • 正则表达式从文本头部向尾部开始解析,文本尾部方向,成为“前”
  • 前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言;后顾/后瞻方向相反
  • JavaScript 不支持后顾
  • 符合和不符合特定断言成为 肯定/正向 匹配和 否定/负向 匹配

语法(规则+断言)

例子:

1
2
3
4
5
6
7
8
9
// 匹配前面是单词或数字,后面是数字
"x3*33vV".replace(/\w(?=\d)/g, '_');
// "_3*_3vV"



// 匹配前面是单词或数字,后面不是数字
"x3*33vV".replace(/\w(?!\d)/g, '_');
"x_*3___"

JS 对象属性

test 和 exec 方法

RegExp.prototype.test()

test() 方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 truefalse

lastIndex:当前匹配结果的最后一个字符的下一个字符(使用 test() 会分段匹配,可能会执行多次,当全文匹配完毕时,会从头匹配)

RegExp.prototype.exec()
exec() 方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null

如果你只是为了判断是否匹配(truefalse),可以使用 RegExp.test() 方法,或者 String.search() 方法。

字符串方法中的正则

String.prototype.search()
search() 方法执行正则表达式和 String 对象之间的一个搜索匹配。

String.prototype.match()
当一个字符串与一个正则表达式匹配时, match() 方法检索匹配项。

String.prototype.replace()
replace() 方法返回一个由替换值替换一些或所有匹配的模式后的新字符串。模式可以是一个字符串或者一个正则表达式, 替换值可以是一个字符串或者一个每次匹配都要调用的函数。

⚠️ 注意:原字符串不会改变。