[JS正则迷你书作者](老姚 的个人主页 - 动态 - 掘金 (juejin.cn))
[JS正则迷你书](《JavaScript 正则表达式迷你书》问世了! - 知乎 (zhihu.com))
字符匹配
模糊匹配
横向模糊和纵向模糊。
横向模糊
字符长度不固定,可以使用量词来匹配。
{m, n} 表示连续出现最少m次,最多n次。
/ab{2,5}c/匹配的是:第一个字符是“a”,接下来是2到5个“b”,最后是字符“c”
g,修饰符,表示全局匹配,不会在遇到第一个符合的字符串时停下。
纵向模糊
具体到某一位字符时,它可以不是某个确定的字符,可以有多种可能。使用字符组来匹配,例如 [abc] ,表示可以是abc中任意一个。
字符组
虽叫字符组(字符类),但只是匹配一个字符。
不管写多长,只是想匹配一个字符,是或的形式
范围表示法
如果想要匹配的字符很多,就可以用下面的方式
/[abcdef12345]/ => /[a-f1-5]/
// 如果想匹配 a - e 三个字符,可以写成
/[-ae]/
/[ea-]/
/[a-e]/
如果写成 [e-a] ,会显示:
// test.html:23 Uncaught SyntaxError: Invalid regular expression: /[e-a]/: Range out of order in character class
这就是将这串当作了范围表示,但是又不能解析,所以报错 正则表达式标识无效
排除字符法
可以是任何字符但是不能是某字符
[^abc] 不可以是abc中的一个。字符组的第一位放 ^(脱字符) ,表示求反的概念。
注意:是在[]中^才是除了、不可以的意思,其他地方表示开头!!!
常见简写形式
| 字符组 | 含义 |
|---|---|
| \d | [0-9],表示0-9中的一个数字,d表示digit |
| \D | [^0-9],表示除0-9以外的一个数字 |
| \s | [ \t\v\n\r\f],表示空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页符。s表示space |
| \S | [^ \t\v\n\r\f],非空白符 |
| \w | [0-9a-zA-Z_],表示数字、大小写字母和下划线。w 是 word 的简写,也称单词字符 |
| \W | [^0-9a-zA-Z_],非单词字符 |
| . | [^\n\r\u2028\u2029],通配符,表示几乎任意字符。换行符、回车符、行分隔符和段分隔符除外 |
如果想匹配任意字符,可以写 [\d\D] 、 [\s\S] 、 [\w\W] , [^]
量词
量词也称重复。
常见简写形式
| 量词 | 含义 |
|---|---|
| {m,} | 表示至少出现m次 |
| {m} | 表示出现m次 |
| ? | 表示不出现或者出现1次 {0,1} |
| + | 表示至少出现1次 {1,} |
| * | 出现或者不出现,出现任意次 {0,} |
贪婪匹配与惰性匹配
// 贪婪匹配:能匹配重复5次的就不匹配重复2次的,这里的贪婪指的是匹配到的字符串位数
var regex = /\d{2,5}/g //表示任意数字出现两次到五次
var string = "123 1234 12345 123456"
console.log(string.match(regex))
// ['123', '1234', '12345', '12345']
// 惰性匹配:尽可能的少匹配,能匹配到重复2次的就不往下匹配了
regex = /\d{2,5}?/g
// 也就是/\d{2,5}{0,1}/g
console.log(string.match(regex))
// ['12', '12', '34', '12', '34', '12', '34', '56']
所有的量词后面都可以加?来达成惰性匹配的效果。
| 惰性匹配 | 贪婪匹配 |
|---|---|
| {m,}? | {m,} |
| {m}? | {m} |
| ?? | ? |
| +? | + |
| *? | * |
多选分支
支持多个子模式任选其一, (p1|p2|p3) ,p1、p2和p3是子模式,用|(管道符)分隔,表示其中之一。
多选分支也是惰性匹配,如果p1匹配上了就不会再往下匹配。
// 错误示范: regex = (/\d/g|/[a-e]/g|/a{3}/g)
// 正确示范:
var regex = /\d|[a-e]|a{3}/g
var string = "ffaaaa123"
console.log(string.match(regex))
// ['a', 'a', 'a', 'a', '1', '2', '3']
// 虽然aaaa这个字符串满足a{3}这个匹配,但是由于惰性匹配,所以被[a-e]匹配了,与顺序有关
// 例子:匹配24小时制时间
var regex=/^([01][0-9]|[2][0-3]):[0-5][0-9]$/;
^ 表示开头, $ 表示结尾
实例
匹配16进制颜色
// var regex = /#([0-9][a-f][A-F]{6}|[0-9][a-f][A-F]{3})/g // 错误 这么写成匹配 3*6 18个字符了
// 注意#和()表示分支,没有括号前面的#可能分配给前面的正则
var regex = /#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g
// #fff #FFF
// #123456 #abcdE3
匹配24进制时间
var regex = /([01][0-9]|2[0-3]):([0-5][0-9])/g
// 13:46 09:18 23:59
var regex1 = /([0]?[0-9]|1[0-9]|2[0-3]):([0]?[0-9]|[1-5][0-9])/g
// 3:9 匹配没有0的格式 [0]?或0?一样
var regex1 = /^(0?[0-9]|1[0-9]|[2][0-3]):(0?[0-9]|[1-5][0-9])$/;
// 这个加了^$,分别表示开头和结尾,匹配成功的必须是一个完整的字符串,从头到尾都能够匹配上,这时如果加上 g 意义不大
var str = "04:45";
console.log(str.match(regex1))
// true
str = "104:451";
console.log(str.match(regex1))
// false
匹配日期
var regex = /\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])/g
// 2024-11-09
匹配window操作系统文件路径
F:\study\javascript\regex\regular expression.pdf
F:\study\javascript\regex\
F:\study\javascript
F:\
盘符:\文件夹\文件夹\文件夹\
var regex = /^[a-zA-Z]:\([^\:*<>|"?\r\n/]+\)*([^\:*<>|"?\r\n/]+)?$/
console.log( regex.test("F:\study\javascript\regex\regularexpression.pdf") );
console.log( regex.test("F:\study\javascript\regex\") );
console.log( regex.test("F:\study\javascript") );
console.log( regex.test("F:\") );