正则表达式笔记(一)-字符匹配

174 阅读5分钟

[JS正则迷你书作者](老姚 的个人主页 - 动态 - 掘金 (juejin.cn))

[JS正则迷你书](《JavaScript 正则表达式迷你书》问世了! - 知乎 (zhihu.com))

字符匹配

模糊匹配

横向模糊和纵向模糊。

横向模糊

字符长度不固定,可以使用量词来匹配。

{m, n} 表示连续出现最少m次,最多n次。

/ab{2,5}c/匹配的是:第一个字符是“a”,接下来是25个“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:\") );