前言
伴随着时间流逝,成功写了几年业务,终于回过头查漏补缺了.其实不论是做什么开发的亦或者什么语言都会是用到正则.回想起来,我日常业务的一些规则校验使用的正则,会直接去搜一个拿来用.也有看到有些心细的同学会记录下来,列一个文档不时的更新,用的时候直接找.简单一句话,能复制的绝不轻易动脑子(可能这是菜的根本原因).
最近在研究vue-router,看到他匹配路径的两段正则.说实话, 含含糊糊看不太懂.再加现在世面上面试官净问一些有的没得:'可以实现一个xx正则吗?',被问烦了.我学还不行吗...
正则,你好
正则表达式是一种文本模式.它包括普通字符('1-9,a-z...'这些)和特殊字符('元字符').我们一般用它来匹配某个句法规则的字符串.它是看起来繁琐的一段字符串,但毋庸置疑它很强大(四两拨千斤,这么说你懂吧?).讲道理对工作效率会有质的提升(为了判断手机号,不用正则,判断代码得写到到猴年马月).
作用
- 它可以用一句话来替换或者一段文本或者字符串(全局替换一些**文案)
- 它可以用来校验一段指定字符串的格式是否符合规则(手机号,邮箱这那的都可以验证)
- 它可以查找文本特定的字段(论文查重了解一下)
在浏览大佬的代码的时候,时不时的会看到一段正则(会写正则感觉八成是大佬...).可能使用 ? 和 * ,或者 $ \ / ^ ...what? 特别是一段很长的正则,根本看不下去好吗.ok,接下来认识一下吧.
正则语法
普通字符
普通字符包括所以大小写字母,所有数字,所以标点符号和一些其他符号.
- [abcde] 在一个字符串中匹配[]中出现的所有字符(好拗口...).
var str = 'hello, bro'
var reg = /[abcde]/g
console.log(str.match(reg)) // ['e', 'b']
- [^abcde] 在一个字符串中匹配[]中没有出现的所有字符.
var str = 'hello, bro'
var reg = /[^abcde]/g
console.log(str.match(reg)) // ["h", "l", "l", "o", ",", " ", "r", "o"]
- [A-Z]/[a-z] 在一个字符串中匹配所有的大写字母/小写字母.
var str = 'Hello, Bro'
var reg = /[A-Z]/g
console.log(str.match(reg)) // ["H", "B"]
- . 在一个字符串中匹配除换行符(\n、\r)的字符.
var str = 'hello, bro'
var reg = /.]/g
console.log(str.match(reg)) // ["H", "e", "l", "l", "o", ",", " ", "B", "r", "o"]
- [\s\S] \s 在一个字符串中匹配所有空白符, \S 在一个字符串中匹配所有非空白符.
var str = 'hello, bro'
var reg = /[\s]/g
console.log(str.match(reg)) // [" "]
- [\w] 在一个字符串中匹配字母、数字、下划线.
var str = 'hello, bro_'
var reg = /\w/g
console.log(str.match(reg)) // ["H", "e", "l", "l", "o", "B", "r", "o", "_"]
特殊字符
特殊字符就是有特殊含义的字符(好像...等于没说).这么说吧,就是一些我们用来生成正则表达式使用的字符,在字符串中出现然后需要把它们匹配掉,就需要用反斜杠转义 \.那这些需要被转义的就叫特殊字符.
- '$' 匹配输入字符串的结尾位置.
- '()' 表示一块需要匹配的内容,标记起始位置.
- '*' 表示匹配前面的表达式零次或多次
- '+' 表示匹配前面的表达式一次或多次
- '.' 表示除了换行符之外的任何单字符
- '[]' 表示一个中括号表达式
- '?' 匹配前面的表达式零次或一次
- \ 将下一个字符标记或特殊字符转义
- '^' 匹配字符串开始位置,在 中括号表达式中表示不匹配括号中的字符
- '{}' 标记限定符表达式
- '|' 两者选一个 '或'的意思
限定符
限定符用来指定正则表达式的一个给定表达式必须出现多少次
- '*' 同上
- '+' 同上
- '?' 同上
- '{n}' n表示一个非负整数, 匹配确定的n次
- '{n,}' n表示一个非负整数,加逗号表示至少匹配n次
- '{n, m}' m,n 都是非负整数 表示最少匹配n次 最多m次
/[0-9]{1,2}/ // 只能1-2位数字
/[1-9][0-9]{0,1}/ 匹配1-99的数字
非打印字符
页面上一些非打印字符也可以是正则表达式的组成部分.
- '\n' 匹配一个换行符
- '\r' 匹配一个回车符
- '\f' 匹配一个换页符
- '\s' 匹配任何空白字符包括上面的非打印字符
[\f\n\r\t\v] - '\S' 匹配任何非空白字符
修饰字符
- 'g' 全局匹配,查找匹配项所有符合的字符
- 'i' 不区分大小写
- 'm' 多行匹配
- 's' 使圆点 . 可以匹配 \n
贪婪表达式
- 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字.
var str = '<div>Hello, Bro_</div>'
var reg = /<.*>/
console.log(str.match(reg)) // <div>Hello, Bro_</div>
非贪婪表达式
与贪婪相反,在贪婪表达式的后面加上一个 ? 就可以实现.因为?是匹配零次或一次.
var str = '<div>Hello, Bro_</div>'
var reg = /<.*?>/
console.log(str.match(reg)) // <div>
总结
上面例举出来的除了普通字符外的都称之为元字符,还有一些没有例举到的.但是目前的这些东西就足够用来应付普通场景了. '宝剑锋从磨砺出' 重在实践练习,不然一切都是空谈.文中的例子是用JavaScript写的,当然不限制语言.了解了正则的基本语法,以及组成部分之后,就需要在日常开发中多实践.
加油.