正则表达式可以说是js的一大利器,对字符串执行模式匹配
创建
直接量语法:
/pattern/attributes
创建 RegExp 对象的语法:
new RegExp(pattern, attributes);
修饰符
修饰符 | 描述 |
---|---|
i | 大小写不敏感匹配 |
g | 全局匹配 |
m | 多行匹配 |
元字符
元字符 | 描述 |
---|---|
\w | 查找单词字符(word) 相当于[a-zA-Z0-9] |
\W | 查找非单词字符(non-word) 相当于 [^a-zA-Z0-9] |
\d | 查找数字(digit) 相当于[0-9] |
\D | 查找非数字(non-digit) 相当于 [^0-9] |
\s | 查找空白字符 (white space) |
\S | 查找非空白字符 (non-white space) |
\b | 匹配单词边界 (word boundary) |
\B | 匹配非单词边界 (non-word boundary) |
\0 | 查找NULl字符 (null (0x00)) |
\n | 查找换行符 |
\f | 查找分页符 |
\r | 查找回车符 |
\t | 查找制表符 |
\v | 查找垂直制表符 |
\xxx | 查找以八进制数 xxx规定的字符 |
\xdd | 查找以十六进制数 dd 规定的字符 |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符 |
这里我们单独说下 \0
字符串的结束符是’\0’,或者NUL,当我们写这样两个字符串的时候:
var a = 'test'
var b = 'test\0'
var c = 'test'
a == c // true
a === c // true
a == b // false
a.match(/\0/) // 没有匹配
b.match(/\0/) // 有匹配
接下来我们再说下Unicode编码,在js中字符串和Unicode编码是可以互相转换的,下面我们来看个例子:
var str = '测试例子'
var char0 = str.charAt(0) // 获取字符
console.log(char0) // 测
var code = str.charCodeAt(0) // 数字编码值
console.log(code) // 27979
var str0 = String.fromCharCode(code) // 编码互转
console.log(str0) // 测
var code16 = code.toString(16); // 转为16进制数组
console.log(code16) // 6d4b
var ustr = "\\u"+code16 // 变成字面量表示法
console.log(ustr) // \u6d4b
零宽断言
所谓零宽断言,实际上用语法指定匹配时的起点或终点。或者说,是一种扩展通配方式。零宽断言本意:A表达式与B表达式是零宽的,即没有任何间隔的,同时,断言或确认某一关系为真,即:B前面是A或不是A为真;或者,A后面是B或不是B为真。
表达式结构 | 描述 |
---|---|
(?=exp) | 匹配exp前面的位置,即某表达式后面是exp |
(?<=exp) | 匹配exp后面的位置,即某表达式前面面是exp |
(?!exp) | 匹配后面跟的不是exp的位置,即某表达式后面不是exp |
(?<!exp) | 匹配前面不是exp的位置,即某表达式前面不是exp |
这里推荐一个正则表达式的一个在线工具 REGEXPER