参考资源:
慕课网 JavaScript 正则表达式
正则表达式的可视化开源工具
JavaScript 正则表达式
REGEXP 对象
JavaScript
通过内置对象 RegExp
支持正则表达式,有两种方法实例化 RegExp
对象
- 字面量
- 构造函数
字面量
1 | var reg = /\bis\b/g |
构造函数
1 | var reg = new RegExp("\\bis\\b", "g") |
修饰符
g
:global
全文搜索,不添加则搜索到第一个匹配停止i
:ignore case
忽略大小写,默认大小写敏感m
:multiple lines
多行搜索
元字符
正则表达式由两种基本字符类型组成
- 原义文本字符如字母
a
,表示的就是小写英文字母a
- 元字符元字符是在正则表达式中有特殊含义的非字母字符
* + ? $ ^ . | \ ( ) { } [ ]
字符类
- 一般情况下正则表达式一个字符对应字符串一个字符
- 表达式
ab\t
的含义就是
有时候需要匹配某一类字符
- 我们可以使用元字符
[]
来构建一个简单的类 - 所谓类是指符合某些特性的对象,一个泛指,而不是特质某个字符
- 表达式
[abc]
把字符a
或b
或c
归为一类,表达式可以匹配这类的字符
字符类取反
- 使用元字符
^
创建 反向类/负向类 - 反向类的意思是不属于某类的内容
- 表达式
[^abc]
表示不是字符a
或b
或c
的内容
范围类
- 我们可以使用 [a-z] 来连接两个字符,表示从
a
到z
的任意字符 - 这是个闭区间,也就是包含
a
和z
本身 - 在 [] 组成的类内部是可以连写的 [a-zA-Z]
预定义类
正则表达式提供预定义类来匹配常见的字符类
边界
常用边界匹配字符
量词
希望匹配一个连续出现 20 次数字的字符串
贪婪模式
正则尽可能的匹配,例如匹配 3-6 个数字,\d{3,6}
,在一串数字中,例如 12345678 ,匹配的结果为 123456
非贪婪模式
让正则尽可能少的匹配,也就是说一旦匹配成功不再继续尝试就是非贪婪模式,直接在量词后加上 ? 即可,例如
1 | "123253253455".match(/\d{3,6}?/g) |
分组
使用 ( )
可以达到分组的功能,使量词作用域分组,例如
(lyctea){3}
或用 | 表示或,例如
lyctea|luoyecong
luoye(c|cong)
反向引用
例如将用 - 连接的日期,转成 / 表示的日期格式
1 | "2017-03-30".replace(/(\d{4})-(\d{2})-(\d{2})/g, "$2/$3/$1") |
忽略分组
不希望捕获某些分组,只需要在分组内加上 ? : 就可以
(?:Byron).(ok)
前瞻
- 正则表达式从文本头部向尾部开始解析,文本尾部方向,成为“前”
- 前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言;后顾/后瞻方向相反
JavaScript
不支持后顾- 符合和不符合特定断言成为 肯定/正向 匹配和 否定/负向 匹配
语法(规则+断言)
例子:
1 | // 匹配前面是单词或数字,后面是数字 |
JS 对象属性
test 和 exec 方法
RegExp.prototype.test()
test()
方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回true
或false
。
lastIndex
:当前匹配结果的最后一个字符的下一个字符(使用 test()
会分段匹配,可能会执行多次,当全文匹配完毕时,会从头匹配)
RegExp.prototype.exec()
exec()
方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null
。
如果你只是为了判断是否匹配(true
或 false
),可以使用 RegExp.test()
方法,或者 String.search()
方法。
字符串方法中的正则
String.prototype.search()search()
方法执行正则表达式和 String
对象之间的一个搜索匹配。
String.prototype.match()
当一个字符串与一个正则表达式匹配时, match()
方法检索匹配项。
String.prototype.replace()replace()
方法返回一个由替换值替换一些或所有匹配的模式后的新字符串。模式可以是一个字符串或者一个正则表达式, 替换值可以是一个字符串或者一个每次匹配都要调用的函数。
⚠️ 注意:原字符串不会改变。