共计 1430 个字符,预计需要花费 4 分钟才能阅读完成。
const str = "abcdefg"
const reg = /bc/ // 定义规则
console.log(reg.test(str)) // 是否匹配 true
console.log(reg.exec(str)) // 执行检索 返回数组
元字符
大多数的字符仅能够描述它们本身,这些字符称作普通字符,例如所有的字母和数字。也就是说普通字符只能够匹配字符串中与它们相同的字符。
元字符是一些具有特殊含义的字符,可以极大提高灵活性和强大的匹配功能。比如,规定用户只能输入 26 个英文字母,普通字符的话 abcdefghijk…,但是换成元字符写法:[a-z]。
在正则表达式中,“.”“*”“?”等符号都有特殊的含义,如果想匹配的就是这些符号,可使用中括号取消这些符号的特殊含义。
分类
- 边界符:表示位置,开头 ^ 和结尾 $
- 量词:表示重复次数
- 字符类:比如 d 表示 0-9
符号 | 含义 |
---|---|
[A-z] | 任意字母 |
. | 任意字符 |
+ | 至少一个,相当于 {1,} |
* | 0 个或多个,相当于 {0,} |
? | 0 个或 1 个,相当于 {0,1} |
w | 任意字母数字下划线 |
W | 除了字母数字下划线 |
d | 任意数字,相当于 [0-9] |
D | 除了数字 |
s | 空格 |
S | 除了空格 |
b | 单词边界 |
B | 除了单词边界 |
字符串方法
split()
可以传递一个正则表达式作为参数。
var s = "1a2A3c4d5r6"
var result = s.split(/[A-z]/)
console.log(result)
search()
该方法只会查找第一个,即使设置全局匹配也没用。
var s = "cbcD aFc aeec app"
var result = s.search(/a[A-z]c/)
console.log(result)
match()
默认情况下 match() 只会找到第一个符合要求的内容,可以设置全局匹配模式(g)来匹配到所有的内容。
var s = "1c22bc3D4Fc00"
var result = s.match(/[a-z]/ig)
console.log(result)
replace()
默认情况下 replace() 只会替换第一个。
var s = "1c22bc3D4Fc00"
var result = s.replace(/[a-z]/gi, "")
console.log(result)
测试正则
JavaScript 中测试正则表达式的一种方法是使用 .test() 方法。.test() 方法会把编写的正则表达式和字符串(即括号内的内容)匹配,如果成功匹配到字符,则返回 true,反之,返回 false。
let myString = "Hello, World!";
let myRegex = /Hello/;
let result = myRegex.test(myString); // true
可以使用 .test 方法的“反向”.match() 方法来提取找到的实际匹配项。
"Hello, World!".match(/Hello/);
先行断言
有两种先行断言:正向先行断言(positive lookahead)和负向先行断言(negative lookahead)。
正向先行断言:pattern1(?=pattern2),pattern1 只有在 pattern2 前面才匹配,pattern2 不会被计入返回结果,比如,要匹配后面跟着百分号的数字,可以写成入 /\d+(?=%)/
。
负向先行断言:pattern1(?!pattern2),pattern1 只有不在 pattern2 前面才匹配,pattern2 不会被计入返回结果,比如,要匹配后面跟的不是百分号的数字,就要写成 /\d+(?!%)/
。